2010-12-10 26 views
9

Je voudrais envoyer le résultat d'une série de commandes à une variable:état du tuyau après la substitution de commande

variable=$(a | few | commands) 

Cependant, la substitution de commande remet à zéro PIPESTATUS, donc je ne peux pas vérifier où il a mal tourné après coup. Une solution serait d'utiliser mktemp et mettre le résultat là temporairement:

variable_file=$(mktemp) || exit 1 
a | few | commands > $variable_file 
exit_codes="${PIPESTATUS[*]}" 
variable=$(<$variable_file) 

Y at-il une solution plus élégante?

+0

Ceci est une bonne question en effet. Je pense qu'il n'y a pas de meilleure solution que la vôtre, j'espère que quelqu'un me prouve mal ;-) Vous connaissez probablement "set -o pipefail", mais de toute façon c'est (plus ou moins) orthogonal à votre question. – tokland

+0

Ok maintenant je suis intrigué parce que je fais de la même façon que vous ... et cela fonctionne ... mais s'il y a quelque chose de plus élégant ... laissez-moi l'avoir ... – Cipi

+1

Voir cette [question] (http://stackoverflow.com/questions/3450960/using-xargs-to-assign-stdin-to-a-variable) pour plus d'idées. Voir aussi [ici] (http://stackoverflow.com/questions/2413166/bash-redirect-and-append-stdout-and-stderr-to-file-and-terminal). –

Répondre

7

Kinda hacky mais je pense que vous pourriez le fudge comme ça.

variable=$(a | few | commands; echo ": ${PIPESTATUS[*]}") 
PIPESTATUS=(${variable##*: }) 
variable=${variable%:*} 
variable=${variable%$'\n'} 
+0

+1, propre tant que vous savez à quoi s'attendre des commandes. – l0b0

+0

si la sortie de 'a | peu | commandes' est nécessaire, le statut peut-il être envoyé par le descripteur de fichier 3? – jozxyqk

+0

@jozxyqk La sortie est capturée dans '$ variable' (après mixage et séparation). – ephemient