【问题标题】:bash 4.3.42 .: is /dev/fd/1 incorrect after redirecting or closing stdout?bash 4.3.42 .: 重定向或关闭标准输出后/dev/fd/1 是否不正确?
【发布时间】:2015-09-22 23:11:05
【问题描述】:

我重定向(或关闭)标准输出,但 /dev/fd(和 /proc/self/fd)仍然显示标准输出到 tty:

% exec 1>日志
% ls -l /dev/fd/ >/dev/stderr

得到这个

共 0
lrwx------ 1 位客人客人 64 Sep 22 15:31 0 -> /dev/pts/1
l-wx------ 1 位客人客人 64 Sep 22 15:31 1 -> /dev/pts/1
lrwx------ 1 位客人客人 64 Sep 22 15:31 2 -> /dev/pts/1
lr-x------ 1 位客人客人 64 Sep 22 15:31 3 -> /proc/14374/fd/

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

命令

% 日期

不在屏幕上打印日期,但

% 猫日志 > /dev/stderr
2015 年 9 月 22 日星期二 15:59:48 PDT

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

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

Fedora fc22 4.1.6-201 & Archlinux 版本???在我的树莓派上

【问题讨论】:

    标签: linux bash redirect proc


    【解决方案1】:

    如您所料,您关闭了 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
    

    【讨论】:

      猜你喜欢
      • 2016-01-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多