重定向 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>&2
和3<&2
。然后fd3
最终指向同一个打开文件描述与 fd 2 一样。它对该模式/方向没有影响打开文件描述。无法更改打开文件描述的模式/方向。
x>&y
和运算符仅在省略x<&y
时不同。是(与 相同),而 是(与 相同)。x
>&y
1>&y
1<&y
<&y
0<&y
0>&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