带管道和重定向的命令

z.h*_*.h. 3 shell pipe io-redirection

包含管道和输出重定向的命令的执行顺序是什么?

假设我们执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

我知道如果你这样做,ls > result那么result将包含它自己的名字,因为外壳会做类似的事情

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

我原以为ls_result值是 2,但结果是 3。

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

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

一些有关信息的链接?(我查过 bash 手册)

Kus*_*nda 14

utility1 | utility2 >output
Run Code Online (Sandbox Code Playgroud)

不等于

( utility1 | utility2 ) >output
Run Code Online (Sandbox Code Playgroud)

但要

utility1 | { utility2 >output; }
Run Code Online (Sandbox Code Playgroud)

这两个实用程序几乎同时启动,这意味着您希望命令有时返回 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
Run Code Online (Sandbox Code Playgroud)

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