同时具有管道和输出重定向的命令的执行顺序是什么?
假设我们执行以下操作:
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_结果