次の(少しばかげた)スクリプト名 '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番目のスクリプトでラップしてラッパーにリダイレクトさせることができることを知っていますが、もっと簡単なものがあるはずです...)
あなたが正しい; 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を変更します。
this によると、次のようなことができます:
#!/bin/bash
exec 2>/dev/null
ls -al test