我知道基本的重定向,但我很困惑应该如何处理同时具有多个文件描述符的情况。
例如,我有写入 FD1
和2
的脚本3
。我想输出script::1
到script::2
stderr 和script::3
stdout。
像这样的东西,不起作用:
./script.sh \
1>&2 \
2>&2 \
3>&1
我想要的重定向如何进行?我不知道要搜索什么。
我知道我可以解决这个问题,而且我实际上已经准备好了解决方法,但我想知道如何做这样的高级魔法。也许有重定向到的东西/proc/self/fd/{1,2}
?
+-----------+ +-----------------+
| >1 ---+---- 2> |
| script.sh >2 ---^ | TTY |
| >3 -------- 1> |
+-----------+ +-----------------+
答案1
我有
script
写入 FD1
和2
的功能3
。我想输出script::1
到script::2
stderr 和script::3
stdout。
只需更改顺序:
./script.sh 3>&1 1>&2
[你可以省略2>&2
,你只需要那个克什米尔对于 fds 大于 2 ;-) ]
对 fd 重定向运算符的最大困惑来自于这样一个事实:人们似乎将神奇的属性附加到>
或<
字符上——事实上,>&
并且<&
100%相同。
每次你看到p>&q
或p<&q
在哪里p
和q
是数字时,将其解析为fd_p = fd_q
作业。
那么很容易看出,如果从 和 开始fd1: out
,fd2: err
从左到右fd3=fd1 fd1=fd2
计算将得到fd1: err
,fd2: err
和fd3: out
。