Soluzione 1:
Dovrebbe essere abbastanza facile scrivere uno script per questo scopo.
Qualcosa come questo script completamente non testato.
OUTPUT=`tempfile`
program_we_want_to_capture &2>1 > $OUTPUT
[ $? -ne 0 ]; then
cat $OUTPUT
exit 1
fi
rm $OUTPUT
D'altra parte per i comandi che eseguo come parte di uno script di solito voglio qualcosa di meglio che stampare semplicemente tutto l'output. Spesso limito ciò che vedo all'ignoto. Ecco una sceneggiatura che ho adattato da qualcosa che ho letto più di dieci anni fa.
#!/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 $?
Soluzione 2:
Non penso che ci sia un modo pulito per farlo, l'unica cosa che mi viene in mente è
- Cattura l'output del comando.
- Controlla il valore di ritorno del comando e se fallisce
- visualizza l'output acquisito.
L'implementazione di questo potrebbe essere un progetto interessante, ma forse al di là di domande e risposte.
Soluzione 3:
Imposterei una funzione bash come questa:
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; }
Quindi, potresti semplicemente eseguire il comando:
suppress foo -a bar
Soluzione 4:
Prova così:
out=`command args...` || echo $out