Bashでのstdinおよびstdoutリダイレクトの優先順位


9

私の質問は、リダイレクトの優先順位がbashであることです。次のコマンドがあるとします。

cmd1 < cmd2 > cmd3

それは次のように変換されますか?

(cmd1 < cmd2) > cmd3

または

cmd1 < (cmd2 > cmd3)

回答:


11

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


これは、BashシェルがPOSIXに対応していることを前提としています。
fpmurphy

1
わかりません。順序は左から右であると述べたので、ls > foo 2>&1stdoutをfooにリダイレクトしてから、stderrをstdoutにリダイレクトする必要はありません。したがって、これは機能しないはずです。同様に、2番目のコマンドが機能するはずです。ここで何が欠けていますか?
Deepak Mittal

1
@fpmurphy bashは、デフォルトの動作が異なるここ説明されている状況を除いて、一般にPOSIXに準拠していますbash。さらにbash適合させるには、--posixオプションを使用できます。
Matt Eckert

@dpacmittal最初の例はls > foo 2>&1、次のように動作します。最初に、標準出力がにリダイレクトされfoo、次に標準エラーが標準出力にリダイレクトされますfoo。現在はファイルです。2番目の例はls 2>&1 > foo、次のように動作します。標準エラーは標準出力がにリダイレクトされる前に標準出力にリダイレクトされるためfoo、標準エラーはファイルに送信される代わりにローカルにエコーされます。
Matt Eckert、2011年

4
@dpacmittal .. re ls 2>&1 >foo おそらくこのように考えることができます。'ls'のstderrはstdoutにリダイレクトされます。これが起こります!stdoutに関連する他のディレクティブに関係なく、stdoutが現在割り当てられている場所に移動します。(これは、prime / firstディレクティブであるためです)。次に、stdoutが「foo」に移動することを示す別のディレクティブが続きます。そして、それは...覚えていない:標準エラー出力が実際に標準出力になりつつに核変換されていない...それはちょうどSTDOUTがどこに行くされた指令の時に割り当てられました。(例、ターミナル)
Peter.O

4

どちらも違いますね。一対の括弧はサブシェルを意味します。ただし、この場合、リダイレクトが原因でサブシェルは開始されません。Bashは単にcmd2stdinにフィードし、stdoutをにフィードしcmd3ます。

私は考えています、あなたは何かのような意味cmd1 | cmd2 | cmd3ですか?あなたのためcmd2cmd3、通常は正常であるファイルの代わりに、「CMDS」。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.