Solution 1 :
Il devrait être assez facile d'écrire un script à cette fin.
Quelque chose comme ce script complètement non testé.
OUTPUT=`tempfile`
program_we_want_to_capture &2>1 > $OUTPUT
[ $? -ne 0 ]; then
cat $OUTPUT
exit 1
fi
rm $OUTPUT
D'un autre côté, pour les commandes que j'exécute dans le cadre d'un script, je veux généralement quelque chose de mieux que de simplement imprimer toute la sortie. Je limite souvent ce que je vois à l'inconnu. Voici un script que j'ai adapté de quelque chose que j'ai lu il y a plus de dix ans.
#!/bin/bash
the_command 2>&1 | awk '
BEGIN \
{
# Initialize our error-detection flag.
ErrorDetected = 0
}
# Following are regex that will simply skip all lines
# which are good and we never want to see
/ Added UserList source/ || \
/ Added User/ || \
/ init domainlist / || \
/ init iplist / || \
/ init urllist / || \
/ loading dbfile / || \
/^$/ {next} # Uninteresting message. Skip it.
# Following are lines that we good and we always want to see
/ INFO: ready for requests / \
{
print " " $0 # Expected message we want to see.
next
}
# any remaining lines are unexpected, and probably error messages. These will be printed out and highlighted.
{
print "->" $0 # Unexpected message. Print it
ErrorDetected=1
}
END \
{
if (ErrorDetected == 1) {
print "Unexpected messages (\"->\") detected in execution."
exit 2
}
}
'
exit $?
Solution 2 :
Je ne pense pas qu'il y ait une façon propre de faire cela, la seule chose à laquelle je peux penser est
- Capturez le résultat de la commande.
- Vérifiez la valeur de retour de la commande et si elle a échoué
- affiche la sortie capturée.
La mise en œuvre de cela pourrait cependant être un projet intéressant, mais peut-être au-delà des questions et réponses.
Solution 3 :
Je configurerais une fonction bash comme celle-ci :
function suppress { /bin/rm --force /tmp/suppress.out 2> /dev/null; ${1+"[email protected]"} > /tmp/suppress.out 2>&1 || cat /tmp/suppress.out; /bin/rm /tmp/suppress.out; }
Ensuite, vous pouvez simplement exécuter la commande :
suppress foo -a bar
Solution 4 :
Essayez ceci :
out=`command args...` || echo $out