私の質問は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をcmd2
stdinに、stdoutをcmd3
。
気になりました。これはどういう意味ですかcmd1 | cmd2 | cmd3
?cmd2
これは、通常cmd3
は「cmds」ではなく、通常のファイルであるためです。