入ると
cat > file.txt 2>&1
その後、標準入力の内容を使用してfile.txt
生成されます。cat
しかし、私がそうするなら
cat > file.txt 1>&2
それからfile.txt
作成されましたが、ファイルは空でした。
上記の2つのコマンドの問題は何ですか?
答え1
順序が重要です。シェルはファイルリダイレクトを処理します。見る順に。 考慮する:
cat >file.txt 2>&1
まず、stdoutがファイルにリダイレクトされますfile.txt
。次に、stderrはstdoutにリダイレクトされます。つまり、file.txt
stdoutとstderrの両方がfile.txt
。
これとは対照的に、次の点を考慮してください。
cat >file.txt 1>&2
まず、stdoutがファイルにリダイレクトされますfile.txt
。 (これによりfile.txt
空のファイルが生成されます。)次に、stdoutがstderrにリダイレクトされます。したがって、stdoutはstderrに移動しますが、内容がないため空のファイルのままですfile.txt
。file.txt
もう一つの興味深い事例
考慮する:
cat 2>&1 >file.txt
まず、stderrはまだターミナルのstdoutにリダイレクトされます。次にstdoutはにリダイレクトされますfile.txt
。 2番目のリダイレクトはstderrには影響しません。それでも端末に送信されます。これはいいえ発行されたfile.txt
。
文書
この動作は次に文書化されていますman bash
。
リダイレクトは、表示された順序で左から右に処理されます。
この順序の例外はパイプであり、また説明されていますman bash
。考慮する:
command1 ... | command2
標準出力はcommand1
パイプを介して標準入力に送信され、command2
この接続を実行します。
今後最初のコマンドで指定されたすべてのリダイレクト。
パイプラインの例
考慮する:
command1 >file.txt | command2
リダイレクトがfile.txt
発生するため後ろにパイプにリダイレクトされると、stdoutはcommand1
に移動しますfile.txt
。 command2
入力は受信されません。
答え2
「>file」を実行すると、実際に「1> file」が実行されます。したがって、あなたがすべきことは、ファイル記述子1を2回リダイレクトすることです。最後の項目のみが適用されます。