あいまいなbashストリームリダイレクト

あいまいなbashストリームリダイレクト

Bashリダイレクトを理解しようとしています(3.6.リダイレクト)。私はテスト環境を準備し、リダイレクト作業の順序とファイル記述子の生成順序を理解しようとしました。

テスト環境の準備:

cd `mktemp -d`
mkdir no_access_dir
chmod 000 no_access_dir

ls -R出力は次のとおりです。

.:
no_access_dir
ls: cannot open directory './no_access_dir': Permission denied

最初の2つのstdoutラインと1つのstderr出力が続きます。

3.6.2 Redirecting Output以下を使用して3.6.4 Redirecting Standard Output and Standard Errorコマンドの動作を確認しました。3.6.8 Duplicating File Desciptors3.6.9 Moving File Desciptors

テストコマンドは次のとおりです。

ls -R 2>&1 > a    # 1. 3.6.2 or 3.6.8
ls -R 2>&1- > a   # 2. 3.6.9
ls -R 1>&2 > a    # 3. 3.6.2 or 3.6.8
ls -R 1>&2- > a   # 4. 3.6.9
ls -R > a 2>&1    # 5. 3.6.4
ls -R > a 1>&2    # 6. 3.6.4

出力説明:

  1. ls -R 2>&1 > a- ファイルaに独自の内容が含まれており、エラーメッセージがありません。なぜですか?
  2. ls -R 2>&1- > a- 上記と変わった点はありません。 - では、モバイルFDの意味は何ですか?
  3. ls -R 1>&2 > a- それでも変わったことはない
  4. ls -R 1>&2- > a- エラーメッセージは表示されず、エラーメッセージはファイルに表示されません。
  5. ls -R > a 2>&1- 両方のストリームがファイルにリダイレクトされます。期待どおりに動作します。
  6. ls -R > a 1>&2- stdoutがstdoutにリダイレクトされるため、ファイルaは空です。

5私はとの出力を理解しています6が、なぜコマンドで1出力23同じで、なぜnumberが4エラーメッセージを表示しないのか、このメッセージをファイルに保存しないのかは謎です。

だから私の質問は次のようになります

  1. [n]>word出力リダイレクトとfdコピーの違いは何ですか[n]>&digit?どちらを使用しますか?2>&1
  2. 1出力ファイルにエラーメッセージが含まれていないのはなぜですか2? stderrストリームがstdoutにリダイレクトされました。
  3. モバイルFDのユースケースは何ですか?
  4. エラーメッセージはどこで発生しますか4?出力ファイルまたはコンソールにありません。

私の現在の理解は次のとおりです。 ls -R > a 2>&1- まず、Bashがファイルを作成し、新しく作成したファイルを検索するaコマンドを実行し、ファイルにリダイレクトして保存するメッセージを表示します。しかし、この場合、構文は非常に不明です。ls -Rastderrstdout

答え1

問題はタイミングです。リダイレクトが発生すると順番に適用されるため、コマンドライン上の場所が重要です。したがって、ポイント1-4の場合、後で来るかどうかは重要ではありません> a。最終的に到達した場合にのみ適用されます。完了したすべてのタスクは&2以前に発生したため、そのポイントにリダイレクトする> aと、&1まだ以前のタスク、つまりターミナル出力を参照します。

関連情報