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

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

次の(やや愚かな)スクリプト名"test1.sh"を考えてみましょう。

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

これを実行すると、echo出力を取得するだけでなく、stderrでbashの睡眠終了に関するレポートも得られます。

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

この場合、stderrの印刷出力を抑制したいと思います。私はコマンドラインで次のようにこれを行うことができることを知っています。

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

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

答え1

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

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

可能な解決策です。 UVVが指摘したように、スクリプトで同等の作業は次のとおりです。

exec 2> /dev/null

/dev/null これにより、再度変更されるまでスクリプトのstderrがこのステートメントにリダイレクトされます。もう一度変える不器用な方法は次のとおりです。

exec 2> /dev/tty

stderrを端末にリダイレクトします。 (必ずしもそうではありませんが)もともとの場所かもしれません。

または

exec 2>&1

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

もっと確実な方法は

3>&2を実行
実行2> /dev/null
(stderrで見たくないことをしてください。)
2>&3を実行

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

プロセス終了通知を抑制する別の方法は次のとおりです。

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

そして

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

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

答え2

~によるとこれ次のことができます。

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

関連情報