这个 shell 命令会做什么?
./myprogram > /dev/null < myfile.c
一般来说,这与使用 < 和 > 的其他顺序有何不同?什么时候可以使用?
我问是因为我只能找到其他命令的示例( ./myprog < myinputs.txt > myoutputs.txt
直接接受 myinputs.txt
的内容并将运行 ./myprog
的结果写入 myoutputs.txt
),以及唯一的示例我能找到类似 ./myprogram > myoutputs.txt << EOF
的东西,但这只是将 EOF 附加到 myoutputs.txt
在 ./myprogram
之后将输出写入其中。
最佳答案
这个声明:
./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,在重定向时并假设之前没有重定向,它是与终端关联的文件句柄。其次,stdout 被重定向到 /dev/null
。这对 stderr 没有影响,因为它的输出继续到终端。
换句话说,2>&1
没有将 stderr 分配给 stdout。相反,它将 stderr 分配给当前与 stdout 关联的文件句柄。随后将 stdout 重定向到另一个文件句柄没有任何区别。这就是顺序在这里很重要的原因。
关于linux - 组合输入和输出 shell IO 重定向(以非标准顺序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33466926/