Existe-t-il une commande Unix standard qui fait quelque chose de similaire à mon exemple ci-dessous
$ <cmd here> 56
$ echo Return code was $?
Return code was 56
$
<cmd here>
devrait être quelque chose qui peut être exécuté par fork et laisse 56 comme code de sortie lorsque le processus se termine. Les commandes internes exit
et return
shell ne conviennent pas à ce que je recherche, car elles affectent le shell appelant lui-même en sortant. <some cmd>
devrait être quelque chose que je peux exécuter dans des contextes non shell - par exemple, invoquer à partir d'un script Python avec subprocess
.
Par exemple, /usr/bin/false
sort toujours immédiatement avec le code retour 1, mais j'aimerais contrôler exactement ce qu'est ce code retour. Je pourrais obtenir les mêmes résultats en écrivant mon propre script wrapper
$ cat my-wrapper-script.sh # i.e., <some cmd> = ./my-wrapper-script.sh
#!/usr/bin/bash
exit $1
$ ./my-wrapper-script.sh 56
$ echo $?
56
mais j'espère qu'il se trouve qu'il existe une commande Unix standard qui peut le faire pour moi.
exit
est le seul auquel je peux penser, mais il a tendance à mettre fin à votre coquille.bash -c 'exit 56'
oubash -c "exit $1"
pourrait travailler pour vous.(exit 56)
?true
etfalse
intégré si vous devez retourner 0 ou 1.Réponses:
Une
return
fonction basée fonctionnerait, et évite la nécessité d'ouvrir et de fermer un autre shell, (selon le commentaire de Tim Kennedy ):Sortie:
en utilisant
exit
un sous-shell:Avec des coques autres que
ksh93
, cela implique de bifurquer un processus supplémentaire est donc moins efficace que ce qui précède.bash
/zsh
/ksh93
seule astuce:(cela implique également un processus supplémentaire (et IPC avec un tuyau)).
zsh
fonctions lambda de:la source
<some cmd>
soit une chose exécutable ()./bin/sh -c ...originalcommand...
Il n'y a pas de commande UNIX standard pour simplement renvoyer une valeur spécifique. Les utilisations de noyau de GNU fournissent
true
etfalse
seulement.Cependant, vous pouvez facilement l'implémenter vous-même comme
ret
:Compiler:
Et courir:
Tirages:
Si vous avez besoin que cela fonctionne partout (où bash est disponible, c'est-à-dire) sans installer d'outils supplémentaires, vous devrez probablement recourir à la commande suivante comme l'a suggéré @TimKennedy dans les commentaires:
Notez que la plage valide de valeurs de retour est 0..255 inclus .
la source
true
etfalse
sont également sous Unix (et même POSIX), pas seulement sous GNU.Si vous avez besoin que l'état de sortie soit défini par une commande exécutée. Il n'y a pas de commande dédiée pour ce 1 , mais vous pouvez utiliser l'interpréteur de n'importe quelle langue qui a la capacité de quitter avec un statut de sortie arbitraire.
sh
est le plus évident:Avec la plupart des
sh
implémentations, cela se limite aux codes de sortie 0 à 255 (sh
acceptera des valeurs plus élevées mais peut les tronquer ou même provoquer l'envoi d'un signal au processus s'exécutantsh
comme avec ksh93 pour les codes 257 à 320).Un code de sortie peut être n'importe quelle
int
valeur integer ( ) mais notez que vous devez le récupérer avec l'waitid()
interface pour que la valeur ne soit pas tronquée à 8 bits (sous Linux, elle est toujours tronquée avecwaitid()
). C'est pourquoi il est rare (et pas une bonne idée) d'utiliser des codes de sortie supérieurs à 255 (utilisez 0-123 pour un fonctionnement normal).Alternativement:
(ceux-ci ne tronquent pas le code de sortie à 8 bits).
Avec NetBSD
find
, vous pouvez faire:1
exit
est la commande standard pour le faire, mais étant une fonction intégrée spéciale du shell , il n'y a pas d'exigence qu'il y ait également une commande de ce nom dans le système de fichiers comme pour les fonctions intégrées normales, et la plupart des systèmes n'en incluent pasla source
Enregistrez-le dans un fichier nommé
returncode.c
etgcc -o returncode returncode.c
la source
argv[argc-1]
place deargv[1]
, et pourquoi vous ne vous plaignez pas siargc>2
. (2) Je serais enclin à faire leargv[1]
test avant leargv[0]
test, permettant à l'utilisateur de diretrue 56
oufalse 56
au lieu dereturncode 56
. Vous ne donnez pas de message siargv[0]
c'est un mot etargc>0
- cela pourrait être déroutant. (3) Je suis obsédé par la convivialité, donc j'utiliseraisstrcasecmp
plutôtstrcmp
. (4) J'ai tendance à valider les paramètres et à ne pas utiliser la valeur de retour deatoi
sans la vérifier. Pour un programme de 2 ¢ comme celui-ci, je suppose que cela n'a pas d'importance.true
nefalse
traite aucun argument dans les systèmes Linuxargv[0]
; les programmes/bin/true
et/bin/false
sont différents exécutables, avec des codes de sortie codés en dur. Vous avez écrit un programme qui peut être installé à la foistrue
etfalse
(lié), ce qui est intelligent. Mais la question demande comment obtenir un statut de sortie spécifié par l'utilisateur. Votre programme répond à cette question, mais uniquement s'il est installé sous un nom de fichier différent. Tant que vous regardez deargv
toute façon, je pense que le faire de la manière que je suggère maintiendrait le niveau d'intelligence, en évitant d'avoir besoin d'un troisième lien.Je ne savais pas exactement si votre seul problème avec la
exit
commande était sa sortie du shell actuel, mais si c'est le cas, un sous-shell pourrait fonctionner.Je l'ai testé sur Cygwin Bash tout à l'heure et cela fonctionne pour moi.
Edit: Désolé d'avoir raté la partie de l'exécuter en dehors d'un contexte shell. Dans ce cas, thsi n'aiderait pas sans l'envelopper dans un
.sh
script et l'exécuter depuis votre environnement.la source
$(exit 42)
essaie d'exécuter la sortie deexit 42
comme une commande simple qui n'a pas de sens (cela ne fonctionnerait pas non plusyash
).(exit 42)
(également exécutéexit
dans un sous-shell, mais laisse sa sortie seule) aurait plus de sens et serait plus portable (même pour csh ou le shell Bourne).