次の(やや愚かな)スクリプト名"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