Commande Unix qui renvoie immédiatement un code de return particulier?

Existe-t-il une command 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> doit être quelque chose qui peut être exécuté par fork et laisse 56 comme code de sortie lorsque le process se termine. Les builtins de shell de exit et de return ne conviennent pas à ce que je cherche car ils affectent le shell invoquant lui-même en sortant de celui-ci. <some cmd> devrait être quelque chose que je peux exécuter dans des contexts non-shell – par exemple, en invoquant un script Python avec un subprocess .

Par exemple, /usr/bin/false termine toujours avec le code de return 1, mais j'aimerais contrôler exactement ce code de return. Je pourrais get les mêmes résultats en écrivant mon propre script d'emballage

 $ cat my-wrapper-script.sh # ie, <some cmd> = ./my-wrapper-script.sh #!/usr/bin/bash exit $1 $ ./my-wrapper-script.sh 56 $ echo $? 56 

mais j'espère qu'il existe une command Unix standard qui peut le faire pour moi.

  1. Une fonction basée sur le return fonctionnerait, et éviterait d'ouvrir et de fermer un autre shell (selon le commentaire de Tim Kennedy ):

     freturn() { return "$1" ; } freturn 56 ; echo $? 

    Sortie:

     56 
  2. utilisant la exit dans un sous-shell:

     (exit 56) 

    Avec des obus autres que ksh93 , cela implique de forger un process supplémentaire, ce qui est less efficace que ci-dessus.

  3. bash / zsh / ksh93 seulement astuce:

     . <( echo return 56 ) 

    (cela implique également un process supplémentaire (et IPC avec une pipe)).

  4. Fonctions lambda de zsh :

     (){return 56} 

Il n'y a pas de command UNIX standard pour simplement renvoyer une valeur spécifique. Les utilitaires de base GNU ne fournissent que des valeurs true et false .

Cependant, vous pouvez facilement implémenter cela vous-même en tant que ret :

 #include <stdlib.h> int main(int argc, char *argv[]) { return argc > 1 ? atoi(argv[1]) : 0; } 

Comstackr:

 cc ret.c -o ret 

Et courir:

 ./ret 56 ; echo $? 

Impressions:

 56 

Si vous en avez besoin pour travailler partout (où bash est disponible) sans installer d'outils supplémentaires, vous devez probablement recourir à la command suivante, comme suggéré par @TimKennedy dans les commentaires:

 bash -c 'exit 56' 

Notez que la plage valide de valeurs de return est 0..255 inclus .

Si vous avez besoin que le statut de sortie soit défini par une command exécutée. Il n'y a pas de command dédiée pour cela 1 , mais vous pouvez utiliser l'interpréteur de n'importe quelle langue qui a la capacité de sortir avec un statut de sortie arbitraire. sh est le plus évident:

 sh -c 'exit 56' 

Avec la plupart des implémentations sh , cela se limite aux codes de sortie 0 à 255 ( sh acceptera des valeurs plus importantes mais pourra les tronquer ou même envoyer un signal au process exécutant sh comme avec ksh93 pour les codes 257 à 320).

Un code de sortie peut être n'importe quelle valeur entière ( int ) mais notez que vous devez le récupérer avec l'interface waitid() pour que la valeur ne soit pas tronquée à 8 bits (sur Linux, elle est toujours tronquée avec waitid() ). Par conséquent, 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:

 awk 'BEGIN{exit 56}' perl -e 'exit 56' python -c 'exit(56)' expect -c 'exit 56' 

(ceux-ci ne tronquent pas le code de sortie à 8 bits).

Avec NetBSD find , vous pouvez faire:

 find / -exit 56 

1 exit est la command standard pour le faire, mais étant un shell embedded , il n'y a aucune exigence qu'il y ait aussi une command de ce nom dans le système de files, comme pour les built-ins réguliers, et la plupart des systèmes ne comprendront pas

 /* Public domain, http://creativecommons.org/publicdomain/zero/1.0/ */ #include <stdio.h> #include <stdlib.h> #include <ssortingng.h> int main(int argc,char **argv) { if(!strcasecmp(argv[0],"true")) return 0; else if (!strcasecmp(argv[0],"false")) return 1; else if(argc<2) {fputs("One argument required\n",stderr);return 1;} else if(!strcasecmp(argv[argc-1],"true")) return 0; else if(!strcasecmp(argv[argc-1],"false")) return 1; else return atoi(argv[argc-1]); } 

Enregistrez-le dans un file nommé returncode.c et gcc -o returncode returncode.c

Je ne savais pas exactement si votre seul problème avec la command exit était de sortir du shell actuel, mais si c'est le cas, un sous-shell pourrait fonctionner.

 username@host$ $(exit 42) username@host$ echo $? 42 

J'ai testé cela sur Cygwin Bash tout à l'heure et cela fonctionne pour moi.

Edit: Désolé j'ai raté la partie de l'exécuter en dehors d'un context shell. Dans ce cas, cela ne vous aiderait pas sans l'envelopper dans un script .sh et en l'exécutant depuis votre environnement.