据我所知,该命令生成的某些输出/usr/bin/modulecmd
既不会发送到 stdout 也不会发送到 stderr,如下例所示:
% /usr/bin/modulecmd bash help null >/dev/null 2>&1
This module does absolutely nothing.
It's meant simply as a place holder in your
dot file initialization.
Version 3.2.9
有什么方法可以调用命令(例如 /usr/bin/modulecmd),使其所有输出都发送到 stdout 或 stderr?或者,是否有某种方法可以调用代码/usr/bin/modulecmd
来捕获它通常会发送到终端的所有输出?
取决于程序做什么。除了标准输出(fd 1)和错误(fd 2)之外,标准输入(fd 0)在程序从终端启动时通常也以读写方式打开,而无需重定向,它可以用于写入输出。另一种选择是显式 open
/dev/tty
,它提供一个新的 fd 连接到进程的控制终端。modulecmd
出于某种原因,使用标准输入。运行strace
它,我们看到它将标题行写入原始 fd 2,然后(在一些不涉及 fd 0 的无关 fd 杂耍之后)将 fd 0(stdin)复制到 fd 2,并在那里打印描述。因此,除了 stdout 和 stderr 的任何重定向之外,您还可以通过将 stdin (fd 0) 重定向到某个文件来重定向该部分消息,例如
0>somefile
(或抑制它)。/dev/null
类似的重定向
< /dev/tty
还可以通过为进程提供显式只读 fd 来阻止输出。(不过,程序会因为调用而出错。)在 Linux上,如果原始标准输入连接到终端write()
,您甚至可以使用相同的结果。< /dev/stdin
如果使用了某些程序
/dev/tty
,则捕获输出会更加困难。如果可用,可以使用类似的东西setsid
在没有控制终端的情况下启动程序,这意味着打开/dev/tty
会失败。(好吧,这就是它在 Linux 上所做的。)我认为问题的答案是“否”,原因如下:您只能重定向命令启动之前存在的输出。那就是:如果命令打开一个新的输出,你不能通过重定向来阻止它。