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

标签 linux shell

这个 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/

相关文章:

c - MMAP 中的 ENODEV 错误

Linux命令不起作用

linux - 什么是 $HOME/.lvm

c - 为什么linux中不混合标准输入?

linux - Symfony3 : Developing in Windows, 在 Linux 中部署。目录分隔符

linux - 捕获一张 Excel 工作表

python - 如何让子进程运行 60 秒

bash - 使用 shell 脚本从文件中提取一行

java - 如何打印没有任何输出的 shell 命令的结果

shell - echo 在 Unix 中如何实际工作