解決策 1:
この目的のためにスクリプトを書くのは簡単です。
この完全にテストされていないスクリプトのようなもの。
OUTPUT=`tempfile`
program_we_want_to_capture &2>1 > $OUTPUT
[ $? -ne 0 ]; then
cat $OUTPUT
exit 1
fi
rm $OUTPUT
一方、スクリプトの一部として実行するコマンドについては、通常、単にすべての出力を出力するよりも優れたものが必要です。私は自分が見るものを未知のものに限定することがよくあります。これは、10 年以上前に読んだものから編集したスクリプトです。
#!/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 $?
解決策 2:
これを行うクリーンな方法はないと思います。私が考えることができる唯一のことは
- コマンドの出力をキャプチャします。
- コマンドの戻り値を確認し、失敗した場合は
- キャプチャした出力を表示します。
これを実装するのは興味深いプロジェクトかもしれませんが、おそらく Q&A を超えています。
解決策 3:
次のような bash 関数をセットアップします:
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; }
次に、コマンドを実行するだけです:
suppress foo -a bar
解決策 4:
試してみてください:
out=`command args...` || echo $out