![符号中的重定向如何按顺序工作?](https://linux22.com/image/47260/%E7%AC%A6%E5%8F%B7%E4%B8%AD%E7%9A%84%E9%87%8D%E5%AE%9A%E5%90%91%E5%A6%82%E4%BD%95%E6%8C%89%E9%A1%BA%E5%BA%8F%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我有文件1、文件2、文件3。
文件1包含1
文件2包含2
文件3包含3
我使用命令
cat file1 > file2 > file3
结果是:
文件11
file2(不包含任何内容)
文件31
为什么这条线上的任何东西都会被摧毁?基本上我在幕后没有看到什么?
(使用“append”的旁注>>
更奇怪)
答案1
Bourne/POSIX 风格 shell 中的重定向比如bash、破折号、ksh 等。
按照它们出现的顺序从左到右进行处理
> x
打开并截断file ,并设置写入标准输出x
的文件描述符。x
您的命令:
cat file1 > file2 > file3
将要:
- 打开和截断
file2
- 设置标准输出以写入该文件描述符
- 打开和截断
file3
- 设置标准输出以写入该文件描述符
- 跑步
cat file1
最终结果是标准输出指向运行file3
时cat
。file2
和都file3
将其当前内容擦除,并将( 的内容)file3
的输出写入其中。cat
file1
如果你想将输出分割成多个流写入单独的文件中,你可以使用tee
:
cat file1 | tee file2 > file3
其他贝壳(尤其zsh
) 的行为有所不同,您的命令将得到您可能期望的结果: 和file2
都会file3
包含file1
.
请注意,cat
这里没有必要;<
输入重定向也能完成这项工作。
答案2
当您多次重定向一个 fd 时,所有重定向都会执行,最后一个重定向会保留:
$ strace -f -e open bash -c 'cat file1 > file2 > file3'
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
[pid 20508] open("file2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 20508] open("file3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...
[pid 20508] open("file1", O_RDONLY) = 3
所以,file2
被打开和截断,然后file3
被打开。