将输出从已知文件描述符重定向到文件就像
./binary 1> ./file 2>&1
但是,假设我有一个二进制文件,它可能使用除0
,1
和之外的文件描述符2
。
文件描述符,如果命令交互运行,1
则2
默认为当前文件描述符tty
我正在以交互方式运行二进制文件,但我认为该二进制文件还有其他指向当前的文件描述符,tty
因为我已经将文件描述符重定向1
到2
一个文件,但仍然有一些输出被写入终端,而不是文件中。
它可能正在使用n
许多其他文件描述符,但我不知道它正在使用哪些。
我只想将所有这些指向当前文件的文件描述符重定向tty
到文件。
我不关心二进制文件写入哪个文件描述符,所有流都应该重定向到该文件
有点像
./binary *> ./file
答案1
如果命令交互运行,文件描述符 1 和 2 默认为当前 tty
不,它们不指向当前的 tty - 它们是 stdout 和 stderr,它们可能通过 shell 和终端的设置方式路由到当前终端。一种重要的区别;您的重定向将 stdout 和 stderr 拼接到某个特定的文件描述符,但与终端本身交互的人不受其影响:
如果您的二进制文件仍在向未重定向的终端写入数据,则它可能没有与 stdout 交互;它直接与伪终端交互(man 7 pty
了解更多信息),例如通过像 ncurses 这样的库。
虽然这是一个字符设备,您可以“窥探”写入的内容,但这在“线性化”形式中可能没有意义。没有什么可以阻止应用程序向后写入单词(“向右移动 2 位,打印 o,向右移动 2 位,打印 l,向右移动 2 位,打印 l,向右移动 2 位,打印 e,向右移动 2 位,打印 h”而不是“你好”)。此外,此类程序往往会立即更新屏幕的重要部分!