比较 3>&2 和 3

比较 3>&2 和 3

重定向 3>&2 和 3<&2 不同吗?

有什么区别?

难道只是在 3>&2 中应该引发错误,因为2未打开输入?

比较:

{ seq 20 1<&2; } 2>/dev/null

{ seq 20 1>&2; } 2>/dev/null

编辑:回答

这两个命令都执行相同的 1 和 2 重复。其输出:

$ strace -f -e trace=dup,dup2 -o o2 sh -c 'seq 20 1>&2'

两个命令完全相等(除了 PID 编号)。

答案1

不,它们是严格等价的,shell 最终会dup2(2, 3)同时处理3>&23<&2。然后fd3最终指向同一个打开文件描述与 fd 2 一样。它对该模式/方向没有影响打开文件描述。无法更改打开文件描述的模式/方向。

x>&y和运算符仅在省略x<&y时不同。是(与 相同),而 是(与 相同)。x>&y1>&y1<&y<&y0<&y0>&y

答案2

一种重定向 stderr 以获取输出,另一种重定向 stderr 以获取输入。

如果您想打开 stderr 进行读写,您可以使用:

2<>/dev/null

如果您登录,所有三个文件描述符都将打开以供读取和写入。

这是通过首先打开 tty 然后调用dup()2 次来完成的。

命令

{ seq 20 1<&2; } 2>/dev/null

{ seq 20 1>&2; } 2>/dev/null

是等价的,因为最终的重定向创建了一个可供写入的文件描述符。

如果您致电:

{ truss -o o seq 20 1<&2; } 2>/dev/null

你会看到 write 调用seq成功,顺便说一句:输出seq转到 /dev/null

相关内容