Lösung 1:
Es sollte einfach genug sein, ein Skript für diesen Zweck zu schreiben.
So etwas wie dieses völlig ungetestete Skript.
OUTPUT=`tempfile`
program_we_want_to_capture &2>1 > $OUTPUT
[ $? -ne 0 ]; then
cat $OUTPUT
exit 1
fi
rm $OUTPUT
Auf der anderen Seite möchte ich für Befehle, die ich als Teil eines Skripts ausführe, normalerweise etwas Besseres, als einfach die gesamte Ausgabe zu drucken. Ich beschränke das, was ich sehe, oft auf das Unbekannte. Hier ist ein Skript, das ich von etwas übernommen habe, das ich vor über einem Jahrzehnt gelesen habe.
#!/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 $?
Lösung 2:
Ich glaube nicht, dass es dafür einen sauberen Weg gibt, das einzige, was mir einfällt, ist
- Erfassen Sie die Ausgabe des Befehls.
- Überprüfen Sie den Rückgabewert des Befehls und ob er fehlgeschlagen ist
- Anzeige der erfassten Ausgabe.
Die Implementierung könnte zwar ein interessantes Projekt sein, aber vielleicht jenseits von Q&A.
Lösung 3:
Ich würde eine Bash-Funktion wie folgt einrichten:
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; }
Dann könnten Sie einfach den Befehl ausführen:
suppress foo -a bar
Lösung 4:
Versuchen Sie Folgendes:
out=`command args...` || echo $out