2014-08-29 74 views
2

伙计!重定向文件描述符

这究竟做了什么?

exec 4<&1 

我明白这是“使输出成为fd 4的输入”。但如果是这样,为什么以下不起作用?

echo a 4>temp.log 

我预计这将在屏幕上打印“a”并将其存储在temp.log文件中。 我知道我可以用三通做同样的事情,但我不知道为什么它不能这样工作。

我在哪里错了?

回答

2

<&是复制输入文件描述符。 4<&1意味着创建一个新的文件描述符4,当它从读取时,它将获得与fd 1相同的内容。

你需要写你的stdout到fd 4是1>&4。但是,它不起作用,因为文件描述符4尚不存在。你必须这样做:

exec 4>temp.log 
exec 1>&4 

第一行将所有的输出重定向到fd 4到那个文件;第二个将标准输出重定向到fd 4.然而,它仍然不会做你想要的; “复制”文件描述符并不意味着输出被发送到2个地方,而是发送到其他地方。在这些句子之后,所有的输出将被发送到“temp.log”,而不是之前的标准输出。

+0

Juan,我看到下面的代码示例: exec 4 <&1; 1> file; 1 <&4; 4怎么变得和&1一样,因此可以恢复原状? – CuriousGuy 2014-08-29 10:55:34

+0

'4 <&1'在fd-4中制作fd-1“位置”的副本,以便稍后使用; '1> file'改变fd-1的含义,以便它被重定向到该文件; '1 <&4'使fd-1指向它的原始位置 – 2014-08-29 10:59:50

+0

是否有命令查看fd表? – CuriousGuy 2014-08-29 11:02:28