私の質問は、リダイレクトの優先順位がbashであることです。次のコマンドがあるとします。
cmd1 < cmd2 > cmd3
それは次のように変換されますか?
(cmd1 < cmd2) > cmd3
または
cmd1 < (cmd2 > cmd3)
私の質問は、リダイレクトの優先順位がbashであることです。次のコマンドがあるとします。
cmd1 < cmd2 > cmd3
それは次のように変換されますか?
(cmd1 < cmd2) > cmd3
または
cmd1 < (cmd2 > cmd3)
回答:
POSIX標準の指定、シェルのリダイレクトは左から右にあること つまり、順序は重要です。
この構成
2>&1は、標準エラーを標準出力と同じファイルにリダイレクトするためによく使用されます。リダイレクトは最初から最後まで行われるため、リダイレクトの順序は重要です。例えば:ls > foo 2>&1標準出力と標準エラーの両方をfileに送信します
foo。しかしながら:ls 2>&1 > foo標準出力がfile
fooに送られる前に、標準エラーが標準出力として複製されたため、標準出力はファイルに送られるだけですfoo。
bash 標準のこの部分に準拠して動作します:
$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$
配管について:
標準入力または標準出力、あるいはその両方のパイプライン割り当てはリダイレクトの前に行われるため、リダイレクトによって変更できます。例えば:
$ command1 2>&1 | command2標準出力と標準エラー出力の両方の送信
command1の標準入力にしますcommand2。
ls > foo 2>&1stdoutをfooにリダイレクトしてから、stderrをstdoutにリダイレクトする必要はありません。したがって、これは機能しないはずです。同様に、2番目のコマンドが機能するはずです。ここで何が欠けていますか?
bashは、デフォルトの動作が異なるここで説明されている状況を除いて、一般にPOSIXに準拠していますbash。さらにbash適合させるには、--posixオプションを使用できます。
ls > foo 2>&1、次のように動作します。最初に、標準出力がにリダイレクトされfoo、次に標準エラーが標準出力にリダイレクトされますfoo。現在はファイルです。2番目の例はls 2>&1 > foo、次のように動作します。標準エラーは標準出力がにリダイレクトされる前に標準出力にリダイレクトされるためfoo、標準エラーはファイルに送信される代わりにローカルにエコーされます。
ls 2>&1 >foo おそらくこのように考えることができます。'ls'のstderrはstdoutにリダイレクトされます。これが起こります!stdoutに関連する他のディレクティブに関係なく、stdoutが現在割り当てられている場所に移動します。(これは、prime / firstディレクティブであるためです)。次に、stdoutが「foo」に移動することを示す別のディレクティブが続きます。そして、それは...覚えていない:標準エラー出力が実際に標準出力になりつつに核変換されていない...それはちょうどSTDOUTがどこに行くされた指令の時に割り当てられました。(例、ターミナル)