J'ai ceci dans un script bash:
exit 3;
exit_code="$?"
if [[ "$exit_code" != "0" ]]; then
echo -e "${r2g_magenta}Your r2g process is exiting with code $exit_code.${r2g_no_color}";
exit "$exit_code";
fi
Il semble qu'il sortira juste après la commande exit, ce qui est logique. Je me demandais s'il y avait une commande simple qui peut fournir un code de sortie sans sortir tout de suite?
J'allais deviner:
exec exit 3
mais il donne un message d'erreur: exec: exit: not found
. Que puis-je faire? :)
bash
shell-script
exec
exit
exit-status
G-Man dit «Réintègre Monica»
la source
la source
exec exit 3
n'est pas bueno, je reçois"exec: exit: not found"
exit_code=3
et supprimerexit 3
complètement la ligne?$?
variable mais ne quitte pas ce script"?Réponses:
Si vous avez un script qui exécute un programme et examine l'état de sortie du programme (avec
$?
), et que vous souhaitez tester ce script en faisant quelque chose qui entraîne$?
une valeur connue (par exemple,3
), faites simplementLes parenthèses créent un sous-shell. Ensuite, la
exit
commande provoque la fermeture de ce sous-shell avec l'état de sortie spécifié.la source
exit_code="3"
pour les testsexit
est un bash intégré, donc vous ne pouvez pasexec
. Par manuel de bash :En rassemblant tout cela, je dirais que votre seule option est de stocker l'état de sortie souhaité dans une variable, puis le
exit $MY_EXIT_STATUS
cas échéant.la source
$?
(même si je ne sais pas vraiment pourquoi vous le feriez), cela semble être une réponse solide. Si vous voulez juste le mettre à une valeur sans succès,false
est une autre option.Vous pouvez écrire une fonction qui retourne le statut donné en argument, ou
255
si aucun n'est donné. (Je l'appelleret
car il "renvoie" sa valeur.)et utilisez
ret
à la place de votre appel àexit
. Cela évite l'inefficacité de la création du sous-shell dans la réponse actuellement acceptée.Quelques mesures.
sur ma machine prend environ 3,5 secondes.
sur ma machine prend environ 0,051 seconde, 70 fois plus vite. Mettre dans la gestion par défaut le laisse encore 60 fois plus rapide. De toute évidence, la boucle a des frais généraux. Si je change le corps de la boucle pour qu'il soit juste
:
outrue
alors le temps est divisé par deux à 0,025, une boucle complètement vide est une syntaxe invalide. L'ajout;:
à la boucle montre que cette commande minimale prend 0,007 seconde, donc la surcharge de la boucle est d'environ 0,018. La soustraction de cette surcharge des deux tests montre que laret
solution est plus de 100 fois plus rapide.C'est évidemment une mesure synthétique, mais les choses s'additionnent. Si vous faites tout 100 fois plus lentement que nécessaire, vous vous retrouvez avec des systèmes lents. 0,0
la source
À propos
exec exit 3
... il essaierait d'exécuter une commande externe appeléeexit
, mais il n'y en a pas, donc vous obtenez l'erreur. Il doit s'agir d'une commande externe au lieu d'une commande intégrée au shell, carexec
remplace complètement le shell. Ce qui signifie également que même si vous aviez une commande externe appeléeexit
,exec exit 3
ne reviendrait pas pour continuer votre script shell, car le shell ne serait plus là .la source
exec bash -c "exit 3"
, mais pour le moment, je ne vois aucune raison de le faire par opposition à justeexit 3
.exec
'ing ou tout simplementexit
' arrêtera le script, ce qui ne semblait pas être ce que la question voulait.Vous pouvez le faire avec Awk:
Ou Sed:
la source
sh -c 'exit 9'
(exit 9)
dans la réponse acceptée