web-dev-qa-db-fra.com

Le té ne reçoit pas toute la sortie du tuyau

J'ai un script qui exécute des commandes comme:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

Le problème est probablement dans le tuyau à tee. Il ne semble pas obtenir la totalité de la sortie. Lorsque l'application se ferme, les dernières lignes de la sortie (généralement celles contenant une erreur fatale) sont manquantes. Lorsque je lance l'application sans canal vers tee, je les récupère dans la sortie.

Comment puis-je forcer le script à attendre que tee termine le traitement de toutes les sorties?

10
Ladislav Mrnka

L'erreur fatale est probablement en train de sortir dans STDERR (2), pas dans STDOUT (1). Vous pouvez rediriger STDERR dans STDOUT avec 2>&1 et le tube devrait également le capturer.

./some_app -i $INDEX 2>&1 | tee $LOG

Si vous rencontrez des problèmes de mise en mémoire tampon, vous pouvez le forcer dans un état non tamponné:

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG
20
Oli

Comme les messages d'erreur sont normalement affichés sur STDERR (descripteur de fichier 2), vous devez rediriger à la fois STDOUT et STDERR vers teename__:

./some_app -i "$INDEX" |& tee "$LOG"

Lorsque vous faites ./some_app -i $INDEX | tee $LOG, vous ne faites que rediriger le STDOUT vers teename__.

|& entraînera la redirection de STDOUT et de STDERR.

Si vous ne pouvez pas rediriger uniquement le STDOUT (comme vous étiez):

./some_app -i "$INDEX" | tee "$LOG"

Par contre, si vous voulez rediriger uniquement le STDERR:

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
5
heemayl