リダイレクトで順序が重要な場合はいつですか? [コピー]

リダイレクトで順序が重要な場合はいつですか? [コピー]

printf "..." 1>&2関数の内部にログアウトを含むスクリプトを作成しました。スクリプト(build.sh)を実行しながらstderrをstdoutに、stdoutをfile [0]にリダイレクトしようとすると、成功するかどうかは順序によって異なります。

  • ./build.sh 2> /tmp/log.txt動作します(明らかに)
  • ./build.sh 1>/tmp/log.txt 2>&1働く
  • ./build.sh 2>&1 1>/tmp/log.txtこのファイルにリダイレクトしないでください。

そしてecho

  • echo "test" 2>&1 >/tmp/log.txt働く
  • echo "test" >/tmp/log.txt 2>&1働く

これはbash、zshで複製され、もともとmkshで報告されました。

コマンドのリダイレクト文の順序はいつ重要ですか?ありがとうございます!

0: わからないなぜ私はこれをしたいのですが、スクリプトユーザーはこれを試してリダイレクトに失敗すると混乱します。

答え1

リダイレクトは左から右にリストされた順序で実行されるため、順序は重要です。 2番目の例(正しい)では、./build.sh 1>/tmp/log.txt 2>&1最初にfd "1"をファイルにマップしてから、"1"を "2"にコピーし、このマッピングを使用してビルドスクリプトを実行します。 3番目の例(動作しない)では、まずコピーします。現在の「1」は「2」と指定され、その後に「1」がファイルにマップされます。現在、「1」はコピー時のファイルではありません。これは、ターミナルまたはCIシェルスクリプト出力キャプチャプログラムです。

関連情報