请解释此shell命令的输出:
ls> file1> file2
为什么输出转到file2而不是file1?
答案 0 :(得分:3)
bash
仅允许每个文件描述符进行一次重定向。如果提供了多个重定向(如您的示例),则会从左到右处理它们,最后一个是唯一生效的重定向。 (但请注意,每个文件仍将被创建,或者如果已经存在则被截断;其他文件将不会被进程使用。)
有些shell(如zsh
)可以选择允许多次重定向。在bash
中,您可以通过对tee
的一系列调用来模拟此问题:
ls | tee file1 file2 > /dev/null
每次调用tee
都会将其输入写入指定文件及其标准输出。
答案 1 :(得分:2)
如果shell发现任何输出的多个重定向,它会将它重定向到给定的最后一个文件,在你的案例文件2中,因为重定向是从左到右计算的。
虽然它有效但你不应该做那样的事情!
答案 2 :(得分:1)
您首先重定向STDOUT流以转到file1,然后立即将其重定向到file2。因此,输出转到file2。
每个进程最初都有三个文件描述符 - 对于STDIN为0,对于STDOUT为1,对于STDERR为2。 >file1
表示打开file1并为其描述符分配id 1.注意,即将执行的进程并不关心其STDOUT的终点是什么。它只是写入文件描述符1描述的内容。
有关其工作原理的更多技术说明,请参阅this answer。
答案 3 :(得分:0)
重定向运算符是stdout重定向(1>)的缩写。由于命令是从左到右计算的,因此最后一个stdout重定向用于运行ls。
ls 1> file1 1>file2
相当于
ls >file1 >file2
如果您尝试重定向stderr,请使用
ls > file1 2> file2
0 = stdin
1 =标准输出
2 = stderr
试试这个,你会发现file2会收到stderr消息。
ls ------ > file1 2> file2
然后这些,在两种情况下输出都将在stdout中,并将转到file1。
ls >file1 2>file2
ls 1>file1 2>file2