如何让 tee 将所有文件描述符打印到屏幕,但仅将标准输出保存到文件?

如何让 tee 将所有文件描述符打印到屏幕,但仅将标准输出保存到文件?

假设我的程序打印到多个文件描述符,并且我需要在打印时观察所有输出,但仅保存stdout到文件中。我怎么做?

答案1

假设 3 是您感兴趣的文件描述符之一。3 可能指向file,例如:

exec 3>file

您的应用程序写入 3:

app() { echo hello world >&3; }

如果你想截获3,你需要将dup它转移到另一个文件描述符(例如4):

exec 4>&3

并使用管道将 3 重定向到您的拦截器进程,该进程必须写回原始目标(否则它就不是拦截器),该目标现在保存在 fd 4 中:

app 3> >(tee /dev/tty >&4) #this interceptor writes to the terminal

上面的内容应该打印hello world到终端并file最终结束hello world

所有这些都假设这些文件描述符在您开始该过程之前已打开。如果您想在运行时动态拦截 filedescriptor 输出,那么恐怕您必须修改代码,在运行时注入代码,或者使用ptrace.

相关内容