bash 4.3.42。:重定向或关闭stdout后,/ dev / fd / 1是不正确的?

时间:2015-09-22 23:11:05

标签: linux bash redirect proc

我重定向(或关闭)stdout但是/ dev / fd(和/ proc / self / fd)仍然显示stdout转到tty:

%exec 1> log
%ls -l / dev / fd /> / dev / stderr

得到这个

总共0
lrwx ------ 1 guest guest 64 Sep 22 15:31 0 - >的/ dev / PTS / 1
l-wx ------ 1 guest guest 64 Sep 22 15:31 1 - >的/ dev / PTS / 1
lrwx ------ 1 guest guest 64 Sep 22 15:31 2 - >的/ dev / PTS / 1
lr-x ------ 1 guest guest 64 Sep 22 15:31 3 - >的/ proc / 14374 / FD /

(ls -l / proc / self / fd /打印相同)。

命令

%date

不在屏幕上打印日期但是

%cat log>的/ dev / stderr的
2015年9月22日星期二15:59:48

表示date命令的输出已写入' log'

我可以在c程序中关闭fd 1(或通过exec 1>& - ),而/ dev / fd / 1仍然显示它指向我的tty。有人对这种行为有解释吗?

Fedora fc22 4.1.6-201& Archlinux版???在我的Raspberry PI上

1 个答案:

答案 0 :(得分:0)

您正如预期的那样关闭了shell的文件描述符1。但是,当您检查文件描述符1是什么时,您使用了:

ls /dev/fd > /dev/stderr

但是>做了什么?对于该单个命令,它重新打开文件描述符1,指向文件/dev/stderr。因此,由于/dev/stderr指向您的伪终端,ls的文件描述符1也将指向您的伪终端,/dev/fd反映了这一点。如果你想打印出shell进程的文件描述符,而不是ls的进程,你需要明确地说:

ls -l /proc/$$/fd > /dev/stderr