符号中的重定向如何按顺序工作?

符号中的重定向如何按顺序工作?

我有文件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

将要:

  1. 打开和截断file2
  2. 设置标准输出以写入该文件描述符
  3. 打开和截断file3
  4. 设置标准输出以写入该文件描述符
  5. 跑步cat file1

最终结果是标准输出指向运行file3catfile2和都file3将其当前内容擦除,并将( 的内容)file3的输出写入其中。catfile1


如果你想将输出分割成多个流写入单独的文件中,你可以使用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被打开。

相关内容