web-dev-qa-db-ja.com

bashスクリプトでstderrメッセージを抑制する

次の(少しばかげた)スクリプト名 'test1.sh'を考えます。

#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep

実行すると、エコーの出力だけでなく、stderrでの睡眠の停止に関するbashのレポートも表示されます。

$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5:  3551 Terminated              sleep 10

この場合、出力をstderrに抑制したいと思います。コマンドラインで次のようにできることはわかっています。

$ ./test1.sh 2> /dev/null

...しかし、それをwithinスクリプトから抑制する方法はありますか? (私はそれを2番目のスクリプトでラップしてラッパーにリダイレクトさせることができることを知っていますが、もっと簡単なものがあるはずです...)

52
fearless_fool

あなたが正しい; pkillはメッセージを生成していません、bashは生成しています。あなたはそれを提案します

$ ./test1.sh 2> /dev/null

可能な解決策です。 UVVが指摘するように、スクリプト内からの同等のアクションは

exec 2> /dev/null

これにより、スクリプトのstderrがこのステートメントから/dev/nullにリダイレクトされ、元に戻されます。それを元に戻す不器用な方法には、

exec 2> /dev/tty

stderrを端末にリダイレクトします。これはおそらく(必ずというわけではありませんが)元々あった場所です。

または

exec 2>&1

これはstderrをstdoutと同じに設定し、間違っている可能性があります。

より信頼できる方法は

exec 3>&2 
 exec 2> /dev/null
(stderrを表示したくない場所で操作します。)
 exec 2>&3

元のstderrをファイル記述子3に保存し、後で復元します。

プロセスの終了の通知だけを抑制する他の方法には、

(sleep 10 & pkill sleep) 2> /dev/null

そして

{ sleep 10 & pkill sleep;} 2> /dev/null

グループ化されたコマンドのみのstderrを変更します。

82
Scott

this によると、次のようなことができます:

#!/bin/bash
exec 2>/dev/null
ls -al test
11
UVV