包含管道和输出重定向的命令的执行顺序是什么?
假设我们执行以下操作:
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
将包含它自己的名字,因为外壳会做类似的事情
1) 创建/打开名为result
2) 的 fd 为result
stdout 3) execls
我ls_result
期望值 2,但它是 3。
问题
上面的命令是如何ls | wc -w > ls_result
执行的?
是否相当于(ls | wc -w ) > ls_result
?
一些相关信息的链接?(我查阅了 bash 手册)
不等于
但要
这两个实用程序几乎同时启动,这意味着您可能希望您的命令有时返回 3,有时返回 2。
例子:
上面显示了管道右侧创建的文件有时会被管道左侧检测到。
男子重击
因此,当您执行命令命令时,正在创建 ls_result 然后它执行 ls 命令。这就是输出为 3 的原因。