509 votes

bash: sortie de tuyau ET capture de statut de sortie

Je veux exécuter une commande de longue durée dans bash shell, et tous deux capturer son statut de sortie, et sa sortie.

Donc je fais ça

 command | tee out.txt
ST=$?
 

Le problème est que la variable ST capture le statut de sortie du tee et non de la commande. Comment puis-je resoudre ceci?

Notez que la commande est longue et rediriger la sortie vers un fichier pour l'afficher plus tard n'est pas une bonne solution pour moi.

607voto

cODAR Points 1126

Il existe une variable d'environnement appelée $ PIPESTATUS; C'est un tableau qui contient le statut de sortie de chaque commande dans votre dernier pipeline de commandes de premier plan.

Utiliser:

 <command> | tee out.txt ; test ${PIPESTATUS[0]} -eq 0
 

165voto

EFraim Points 7137

Solution muette: les reliant à travers un tuyau nommé (mkfifo). Ensuite, la commande peut être exécutée en second.

  mkfifo pipe
 tee < pipe&
 command > pipe
 

153voto

Felipe Alvarez Points 509

l'utilisation de bash set -o pipefail est utile

pipefail: la valeur de retour d'un pipeline est le statut de la dernière commande à quitter avec un statut non nul, ou zéro si aucune commande n'est sortie avec un statut différent de zéro

38voto

Stefano Borini Points 36904

Il y a un tableau qui vous donne le statut de sortie de chaque commande dans un tube.

 $ cat x| sed 's///'
cat: x: No such file or directory
$ echo $?
0
$ cat x| sed 's///'
cat: x: No such file or directory
$ echo ${PIPESTATUS[*]}
1 0
$ touch x
$ cat x| sed 's'
sed: 1: "s": substitute pattern can not be delimited by newline or backslash
$ echo ${PIPESTATUS[*]}
0 1
 

23voto

par Points 4359

En combinant les et le résultat de l’exécution du de commande dans un sous-shell, vous pouvez accéder directement à la valeur de retour de votre commande initiale :

``

Voici un exemple :

vous donnera :

``

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X