Bashでのstdinとstdoutリダイレクトの優先順位

Bashでのstdinとstdoutリダイレクトの優先順位

私の質問はbashのリダイレクト優先順位についてです。次のようなコマンドがあるとしましょう。

cmd1 < cmd2 > cmd3

次のように翻訳できます。

(cmd1 < cmd2) > cmd3

または

cmd1 < (cmd2 > cmd3)

答え1

これPOSIX標準条項シェルリダイレクトは左から右に行われます。つまり、順序が重要です。

この構成は2>&1通常、標準エラーを標準出力と同じファイルにリダイレクトするために使用されます。リダイレクトは最初から最後まで発生するため、リダイレクトの順序が重要です。たとえば、

ls > foo 2>&1

標準出力と標準エラーをファイルに直接送信しますfoo。しかし:

ls 2>&1 > foo

foo標準出力がfileに指定される前に標準エラーが標準出力にコピーされるため、標準出力のみがfileとして指定されます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

答え2

私はそうは思わない。一対の括弧はサブシェルを表します。ただし、この場合、リダイレクトによりサブシェルは起動しません。 Bashはstdinをcmd2stdinに、stdoutをcmd3

気になりました。これはどういう意味ですかcmd1 | cmd2 | cmd3cmd2これは、通常cmd3は「cmds」ではなく、通常のファイルであるためです。

関連情報