このパイプラインで `2>&1` が機能しないのはなぜですか?

このパイプラインで `2>&1` が機能しないのはなぜですか?

NAS でエラーをリダイレクトする方法が見つかりません。

シェルは/bin/sh、使用すると> mylogfile.log 2>&1ターミナルにエラーが印刷されます。具体的なコマンドは

find /volume1/ | grep "totoro" > ~/totoro.log 2>&1

からのエラーが表示されますfind。リダイレクトを機能させる方法はありますか?findログ ファイルにエラーを書き込むにはどうすればいいですか?

答え1

find /volume1/ | grep "totoro" > ~/totoro.log 2>&1

あなただけに2>&1影響しgrep、 には影響しませんfind。以下のコマンドでは、最初のもの2>&1が に影響しますfind:

find /volume1/ 2>&1 | grep "totoro" > ~/totoro.log 2>&1   # probably wrong

findしかし、これはからstdout とともに stderr を に送信します。からの stderr をフィルターしgrepたくないでしょう。おそらく、合成コマンド全体の stdout と stderr をキャプチャしたいのでしょう。そうであれば、明示的なサブシェルでコマンドを実行し、その出力とエラー ストリームをリダイレクトします。grepfind

(find /volume1/ 2>&1 | grep "totoro") > ~/totoro.log 2>&1

答え2

「tee」コマンドを参照してください。このコマンドは標準入力から読み取り、標準出力とファイルに書き込みます。ここではこれが役立ちます。

関連情報