J'ai un script exécutant 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 sortie entière. Lorsque l'application se ferme, les dernières lignes de la sortie (généralement celles contenant une erreur fatale) sont manquantes. Lorsque j'exécute l'application sans pipe pour les tee
obtenir dans la sortie.
Comment puis-je forcer le script à attendre que le tee termine le traitement de toutes les sorties?
Réponses:
L'erreur fatale sort probablement dans STDERR (2), pas STDOUT (1). Vous pouvez rediriger STDERR vers STDOUT avec
2>&1
et le tube devrait également le capturer.Si vous avez des problèmes de mise en mémoire tampon, vous pouvez le forcer à un état sans tampon:
la source
Comme les messages d'erreur sont normalement affichés sur STDERR (descripteur de fichier 2), vous devez rediriger STDOUT et STDERR vers
tee
:Lorsque vous le faites,
./some_app -i $INDEX | tee $LOG
vous redirigez uniquement le STDOUT verstee
.|&
entraînera la redirection de STDOUT et de STDERR.Si vous ne pouvez pas rediriger uniquement le STDOUT (comme vous l'étiez):
En revanche si vous souhaitez rediriger uniquement le STDERR:
la source