如前所述,这里 bash
不支持多路分解,也不支持多路复用。您看到的效果是每个文件都打开了O_TRUNC
,这意味着所有内容都被破坏了。当指定多个重定向时,它们会立即再次关闭,仅保留最后一个重定向并实际接收任何数据。
strace
这是运行命令的摘录:
strace -f -e open,dup2,close bash -c 'ls > one > two > three'
...
open("one", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
open("two", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
open("three", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 3
dup2(3, 1) = 1
close(3) = 0
...
如您所见,bash 不断覆盖相同的文件描述符。所以只有最后一个会收到任何数据。一种解决方法是使用tee
which 将接收stdin
到的内容写入其所有参数和stdout
:
ls | tee One Two Three > /dev/null
在旁注中,zsh
确实支持这一点:
zsh$ setopt multios
zsh$ ls > One > Two > Three