2017-05-05 1 views
1

J'ai une commande foobar qui est toujours verbeuse et je veux afficher sa sortie (stdout et stderr) vers la console seulement quand le code de sortie de foobar est un code d'erreur. Je veux atteindre ce sans enregistrer la sortie dans un fichier temporaire Je connais déjà cette solution de contournement mais je ne veux pas générer de nouveaux fichiers. Il est implicite que l'inconvénient d'une telle solution serait que la sortie entière sera vue seulement quand foobar se termine, car alors seulement nous saurons si elle a réussi ou non.Comment utiliser des tubes shell pour afficher de façon conditionnelle les résultats en fonction du code de sortie?

+0

Pouvez-vous donner un exemple de code? – 123

+1

Y a-t-il une raison pour laquelle vous ne pouvez pas utiliser un fichier? – 123

+0

Ce n'est pas une solution de contournement; c'est ce que vous devez faire. Le shell ne met pas la sortie en mémoire tampon pour vous d'une autre manière. – chepner

Répondre

4

Vous pouvez essayer juste en enregistrant la sortie dans une variable. Une simple doublure serait:

r=$(foobar 2>&1) || echo "$r"

+0

J'ai repéré un inconvénient important de cela, en utilisant cette approche, je perds la coloration ANSI que je ne veux pas. – sorin

+0

@sorin Les codes ANSI devraient fonctionner correctement, et ils le font dans mes tests. 'r = $ (printf" \\ 033 [33mHello \\ 033 [39m \ n "; sortie 1) || echo "$ r" 'affiche" Hello "en jaune sur mon terminal. L'écho n'interprète pas les séquences d'échappement mais votre commande foobar devrait le faire si vous obtenez des couleurs lorsque vous l'exécutez directement. – ccarton

+0

En effet, je devais seulement imposer leur utilisation mais cela est nécessaire avec n'importe quel wrapper. J'ai implémenté votre solution à la fin, pas d'outils externes. – sorin

1

Vous voulez sans doute l'utilitaire chronic:

chronique

exécute une commande, et organise pour sa sortie standard et l'erreur standard seulement affiché si la commande échoue (ou se bloque sort non nulle). Si la commande réussit, toute sortie étrangère sera cachée.

Disponibilité:

  • apt-get install moreutils sur Debian/Ubuntu
  • brew install moreutils sur Mac OS (OSX)
  • yum install moreutils sur RHEL (epel)/Fedora/CentOS