带管道和重定向的命令

带管道和重定向的命令

同时具有管道和输出重定向的命令的执行顺序是什么?

假设我们执行以下操作:

Charles@myzone:/tmp$ mkdir /tmp/testdir      
Charles@myzone:/tmp$ cd /tmp/testdir   
Charles@myzone:/tmp/testdir$ touch file1 file2  
Charles@myzone:/tmp/testdir$ ls | wc -l
2
Charles@myzone:/tmp/testdir$ ls | wc -l > ls_result
Charles@myzone:/tmp/testdir$ cat ls_result
3

我知道如果你这样做,ls > result那么result将包含其自身的名称,因为 shell 会执行类似的操作

1) 创建/打开名为的文件result 2) 将 fd 设置result为 stdout 3) execls

我原本期望值ls_result为 2,但结果是 3。

问题

上面的命令是如何ls | wc -w > ls_result执行的?

它相当于吗(ls | wc -w ) > ls_result

一些相关信息的链接? (我查阅了 bash 手册)

答案1

utility1 | utility2 >output

不等于

( utility1 | utility2 ) >output

但为了

utility1 | { utility2 >output; }

这两个实用程序几乎同时启动,这意味着您希望命令有时返回 3,有时返回 2。

例子:

$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
exists
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test
$ { [ -f test ] && echo exists >&2; } | { echo >test; }; rm test

上面显示了管道右侧创建的文件是有时由管道左侧检测到。

答案2

男人狂欢

REDIRECTION
       Before  a  command is executed, its input and output may be redirected using a special notation interpreted by the shell.  Redirection
       may also be used to open and close files for the current shell execution environment.  The following redirection operators may precede
       or appear anywhere within a simple command or may follow a command.  Redirections are processed in the order they appear, from left to
       right.

因此,当您执行命令时,将创建 ls_result,然后执行 ls 命令。这就是为什么输出为 3。

LS | wc -l > ls_结果

相关内容