组合输入和输出shell IO重定向(以非标准顺序)

时间:2015-11-01 20:37:43

标签: linux shell

这个shell命令会做什么?

./myprogram > /dev/null < myfile.c

一般来说,这与使用&lt;的其他顺序有什么不同?和&gt;?什么时候可以使用?

我问,因为我只能找到另一个订单(./myprog < myinputs.txt > myoutputs.txt的示例,它直接接受myinputs.txt的内容,并将运行./myprog的结果写入{{1} }}),我能找到的与此类似的唯一示例类似于myoutputs.txt,但只是在./myprogram > myoutputs.txt << EOF将输出写入myoutputs.txt之后将EOF附加到./myprogram

1 个答案:

答案 0 :(得分:3)

本声明:

./myprogram >/dev/null <myfile.c

与:

相同
./myprogram <myfile.c >/dev/null

在这种情况下,重要的不是重定向的顺序。

更复杂的案例

当重定向的目标本身被重新定义时,重定向的顺序很重要。例如,考虑:

cmd >/dev/null 2>&1

在上面,stdout和stderr都转到/dev/null。现在,考虑一下:

cmd 2>&1 >/dev/null

在这种情况下,相比之下,stderr首先被重定向到stdout,在重定向时并且假设没有先前的重定向,stdr是与终端关联的文件句柄。其次,stdout被重定向到/dev/null。这对stderr没有影响,因为它的输出继续到达终端。

换句话说,2>&1不会将stderr分配给stdout。相反,它将stderr分配给当前与stdout关联的文件句柄。随后将stdout重定向到另一个文件句柄没有任何区别。这就是为什么订单在这里很重要。