プログラムはSTDOUT / STDERR以外の場所にどのように出力しますか?それを避ける方法?

プログラムはSTDOUT / STDERR以外の場所にどのように出力しますか?それを避ける方法?

明らかに利用可能なすべての出力先がわかりません。私はstdout&1)とstderr&2)を知っています。しかし、両方の記述子をリダイレクトした後、時々まだ私のコンソールからいくつかの出力を得る!

私が考えることができる最も簡単な例はGNU Parallelです。使用するたびに参照通知が表示されます。これにより、&2>1 > file通知が引き続き表示されます。

同じことが当てはまりますemerge:私が実行して何か間違っている場合、いくつかのメッセージは印刷されません。stdoutなぜならstdin私はそれらをリダイレクトしているので、まだ渡されているからです。

を使用してこれらの問題をほとんど解決しましたが、scriptまだ問題の原因が何であるかを知りたいです。

ベストアンサー1

使用中の構文が正しくありません。

cmd &2>1 >file

に分割されます

cmd &
2>1 >file

これは次のことを行います。

  1. cmdリダイレクトなしでバックグラウンドジョブとして実行
  2. 別のプロセス(コマンドなし!)からstderr文字通り呼び出されたファイルにリダイレクト1し、次にstdoutリダイレクトします。file

必要な構文は次のとおりです。

cmd >file 2>&1

作業順序が重要です。これは次のことを行います。

  1. stdoutリダイレクトfile
  2. リダイレクト -stderrつまり&1、同じファイルハンドルstdout

その結果stderrと両方stdoutにリダイレクトされますfile

では、bashより単純な非標準構文(移植性のために推奨されていない)もcmd &> file同じことを行います。

おすすめ記事