链式重定向的内部逻辑

链式重定向的内部逻辑

当我打字时

cat some_file > new_file1 > new_file2

some_file我从innew_file2和 empty得到输出new_file1

这其中的内在逻辑是什么?更具体地说,stdout文件的内容是什么?

注意:在 Windows 上,会跳过中间文件。

答案1

这取决于外壳。

在 bash 中,echo derp >file1 >file2首先打开file1,截断它,然后安排将stdoutofecho derp写入file1。然后 bash 对 执行相同的操作file2:它打开file2、截断它,并安排将stdoutofecho derp写入而不是写入file2

最终效果是被file1截断(即内容被删除)并且stdout仅进入file2.没有发生链接。 Bash 一次只能将标准输出重定向到一个地方。对于管道也是如此:echo derp > file | cat“derp”的结果被写入文件,而不是管道。

然而,在 zsh 中,正如您直观所期望的那样,echo derp >file1 >file2同时写入file1和。如果您使用 zsh,file2请参阅 MULTIOS了解详细信息。man zshmisc

要在 之外实现此目的zsh,您可以简单地使用tee:echo derp | tee file1 file2 > /dev/null相当于 zsh 的echo derp >file1 >file2

相关内容