我有文件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
被打开。