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)
将要:
file2
file3
cat file1
最终结果是标准输出指向file3
时间cat
运行。双方file2
并file3
有自己的当前内容擦除,并且file3
得到的输出cat
(的内容file1
写进去)。
如果要将输出拆分为写入单独文件的多个流,可以使用tee
:
cat file1 | tee file2 > file3
Run Code Online (Sandbox Code Playgroud)
其他炮弹(尤其是zsh
)表现不同,和你的命令将有可能你所期望的结果:既file2
与file3
本来的内容file1
。
请注意,cat
这里没有必要;<
输入重定向也可以完成这项工作。
当您多次重定向 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
被打开。
归档时间: |
|
查看次数: |
360 次 |
最近记录: |