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

No *_*ime 7 shell bash io-redirection

我有文件 1、文件 2、文件 3。


文件 1 包含 1

文件 2 包含 2

文件 3 包含 3

我使用命令

cat file1 > file2 > file3

结果是:

文件 1 1

file2(不包含任何内容)

文件 3 1


为什么沿着这条线的任何东西都会被破坏?基本上我在幕后没有看到什么?

(使用“附加”的旁注>>甚至更奇怪)

Mic*_*mer 14

Bourne/POSIX 风格的 shell 中的重定向,例如 bash、 dash 、 ksh 等。

按照它们出现的顺序处理,从左到右

> x 打开并截断file x,并将写入的文件描述符设置x为标准输出。你的命令:

cat file1 > file2 > file3
Run Code Online (Sandbox Code Playgroud)

将要:

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

最终结果是标准输出指向file3时间cat运行。双方file2file3有自己的当前内容擦除,并且file3得到的输出cat(的内容file1写进去)。


如果要将输出拆分为写入单独文件的多个流,可以使用tee

cat file1 | tee file2 > file3
Run Code Online (Sandbox Code Playgroud)

其他炮弹(尤其是zsh)表现不同,和你的命令将有可能你所期望的结果:既file2file3本来的内容file1


请注意,cat这里没有必要;<输入重定向也可以完成这项工作。


mur*_*uru 9

当您多次重定向 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
Run Code Online (Sandbox Code Playgroud)

所以,file2被打开并截断,然后file3被打开。