假设我的程序打印到多个文件描述符,并且我需要在打印时观察所有输出,但仅保存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
.