一个命令中有两个重定向操作符

时间:2013-11-19 20:46:04

标签: bash shell

请解释此shell命令的输出:

ls> file1> file2

为什么输出转到file2而不是file1?

4 个答案:

答案 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