Řešení 1:
Pro tento účel by mělo být dostatečně snadné napsat skript.
Něco jako tento zcela netestovaný skript.
OUTPUT=`tempfile`
program_we_want_to_capture &2>1 > $OUTPUT
[ $? -ne 0 ]; then
cat $OUTPUT
exit 1
fi
rm $OUTPUT
Na druhou stranu pro příkazy, které spouštím jako součást skriptu, obvykle chci něco lepšího, než jen tisknout celý výstup. Často omezuji to, co vidím, na neznámé. Zde je scénář, který jsem upravil podle něčeho, co jsem četl před více než deseti lety.
#!/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 $?
Řešení 2:
Nemyslím si, že existuje čistý způsob, jak to udělat, jediné, co mě napadá, je
- Zachyťte výstup příkazu.
- Zkontrolujte návratovou hodnotu příkazu a zda selhal
- zobrazit zachycený výstup.
Implementace tohoto může být zajímavý projekt, ale možná nad rámec otázek a odpovědí.
Řešení 3:
Nastavil bych bash funkci takto:
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; }
Pak stačí spustit příkaz:
suppress foo -a bar
Řešení 4:
Zkuste to:
out=`command args...` || echo $out