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?
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
Comme les messages d'erreur sont normalement affichés sur STDERR (descripteur de fichier 2), vous devez rediriger à la fois STDOUT et STDERR vers tee
name__:
./some_app -i "$INDEX" |& tee "$LOG"
Lorsque vous faites ./some_app -i $INDEX | tee $LOG
, vous ne faites que rediriger le STDOUT vers tee
name__.
|&
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"