en utilisant
time sleep 1
rendements:
$ time sleep 1
real 0m1.005s
user 0m0.001s
sys 0m0.001s
puis-je utiliser une commande pour imprimer le code de sortie sleep
ou la commande que je veux exécuter?
Quelque chose aime:
$ log-exit-code sleep 1
peut-être cela suffit-il?
sleep 1 && echo "$?"
exit
exit-status
Alexander Mills
la source
la source
sleep 1 && echo $?
imprimerait le code de la cellule dormante seulement quand il est nul ...sleep 1 && echo "$?" || echo "$?"
EXIT_CODE=$(tellexit command)
Réponses:
Dans mes tests jusqu'à présent, cela a fonctionné:
command && echo "$?" || echo "$?"
Il lui dit simplement de faire écho au code de sortie s'il réussit ou s'il échoue.
Comme Sato l'a souligné ci-dessous, cela revient essentiellement à:
command; echo "$?"
Une chose qui pourrait rendre la commande and / ou intéressante est quelque chose comme:
command && echo "Success! Exit Code: $?" || echo "Failure! Exit Code: $?"
Si vous avez besoin que votre script agisse sur le code de sortie comme c'est le cas d'Olivier, ce n'est pas un problème. Votre script pourrait ressembler à quelque chose comme:
la source
command; echo $?
?command; echo $?
est une bien meilleure réponse.command ; echo $?
carecho $?
toujours réussit et donc après cela, la nouvelle valeur de $? est maintenant 0. Il existe un moyen de conserver le code retour d'origine même après l'avoir affiché, au cas où ce code retour original serait utile plus tard (par exemple: dans un script, la vérification du code retour est importante avant de décider comment continuer). Voir ma réponse pour l'une des nombreuses solutions (la plupart des réponses ici peuvent être modifiées de la même manière)cmd && echo "$?"
ne fonctionnerait pas car il n'imprimerait par nécessité que des zéros (leecho
ne s'exécuterait qu'en cas de réussite de la commande précédente).Voici une fonction shell courte pour vous:
Cela imprime le code de sortie de la commande donnée de la même manière que la
time
commande.En redirigeant le
printf
vers/dev/tty
dans la fonction, nous pouvons toujours utilisertellexit
des redirections sans obtenir de courrier indésirable dans nos flux de sortie ou d'erreur standard:En enregistrant le code de sortie dans une variable, nous pouvons le renvoyer à l'appelant:
Une version plus sophistiquée de la même fonction imprime également le signal qui a tué la commande si le code de sortie est supérieur à 128 (ce qui signifie qu'il s'est terminé en raison d'un signal):
Essai:
(La
local
chose nécessiteash
/pdksh
/bash
/zsh
, ou vous pouvez la changer,typeset
ce que quelques autres shells comprennent également.)la source
Utilisez une fonction shell wrapper. Probablement avec un nom différent.
(Bien sûr, cela corrompra la sortie standard, alors utilisez le
tty
comme indiqué par @Kusalananda ou ne l'utilisez pas en dehors des contextes interactifs.)En virant vers un territoire non transférable, certains shells peuvent signaler l'état de toutes les commandes dans un pipeline, pas seulement la dernière, par exemple dans ZSH si vous souhaitez que les défaillances soient signalées à partir d'un pipeline entier:
TRAPZERR
sinon, il ne se déclenche pas lorsqu'il n'y a pas d'erreur (sur le principe «aucune nouvelle n'est bonne»).la source
GNU
time
a une option pour cela:Passe par le code de sortie 1 , sauf s'il est tué par un signal 2 :
Si vous voulez connaître / gérer la situation de destruction de signal, passez
-v
et grep le stderr pour la chaîneCommand terminated by signal
.1 Merci à Olivier Dulac d'avoir noté que le code de sortie passe.
2 Merci également à Stéphane Chazelas pour avoir souligné que le code de sortie du signal kill ne passe pas.
la source
0
cependant si la commande est supprimée.256+signum
ou384+signum
ou mêmesignum/256
ousignum/256+0.5
si un noyau a été généré (en fait, le statut renvoyé parwaitpid()
divisé par 256). Certains donneraient une représentation textuelle (commesigint
ousigquit+core
). Il vaut probablement la peine de discuter du groupe de discussion gnu.coreutils.bugs, je suis d'accord.time
fait ne fait pas partiecoreutils
, c'est un package à part entière avec sa propre liste de diffusion de bugs ([email protected]))system()
des awks traditionnels comme celui encore maintenu par Brian Kernighan (l'k
inawk
) ou lenawk
de Solaris, leawk
de FreeBSD qui en dérivent.awk 'BEGIN{print system("kill -s ABRT $$")}'
sort0.523438
lorsque la taille de vidage de mémoire n'est pas limitée. Le comportement degawk
a changé récemment, avec un comportement variable avec--traditional
ou--posix
(voir aussi la valeur de retour declose(cmd)
pour plus de variation)Je n'aime pas toutes les autres réponses (bien que j'aime beaucoup pour leur intelligence): ils affichent le code de sortie mais ils LE CHANGENT également. (la partie d'affichage est vraie, donc après elle le code retour est 0)
Voici une version modifiée:
la source
time
qui n'est pas toujours disponible.Pour être un peu plus robuste, envoyez l'état de sortie à un FD séparé afin qu'il puisse être géré indépendamment de stdout / stderr:
Notez que vous devrez faire quelque chose avec FD3 ou cela vous dira
Bad file descriptor
.Cela pourrait être configuré davantage pour fournir ces sorties aux entrées d'un autre programme en faisant écouter l'autre programme sur plus d'un FD; vous pouvez l'utiliser comme une sorte de Kibana du début des années 90 :)
la source
Alors que toutes les autres réponses (très intéressantes) répondent à la question exacte posée par le PO, dans la pratique, les choses sont généralement plus simples. Il vous suffit d'enregistrer l'état de sortie dans une variable (immédiatement après la commande) et de le signaler ou de l'enregistrer comme vous le souhaitez. Par exemple, imprimer dans / dev / stderr ou l'écrire / l'ajouter sous forme de message texte dans un fichier journal. Et, il est également conservé pour une utilisation dans la prise de décision / contrôle de flux dans le code suivant.
Si c'est dans une fonction:
Si c'est directement dans un script:
(Ducking et couvrant parce que cela ne répond pas à la question exacte .)
la source