有没有什么方法可以将 stdout (1) 从该“管道”重定向到(我不知道我到底如何解释这一点,如果有人可以解释如何处理这一点,或者给我一些关于这一点的阅读,我会很高兴)一些其他输出,例如。文件或终端?
-bash-4.2$ ls -l /proc/11/fd
total 0
lrwx------ 1 us sudo 64 Sep 24 11:26 0 -> /dev/null
l-wx------ 1 us sudo 64 Sep 24 11:26 1 -> pipe:[20619]
l-wx------ 1 us sudo 64 Sep 24 11:26 2 -> pipe:[20620]
lrwx------ 1 us sudo 64 Sep 24 11:26 3 -> socket:[30376]
lr-x------ 1 us sudo 64 Sep 24 11:26 4 -> /dev/null
l-wx------ 1 us sudo 64 Sep 24 11:26 5 -> pipe:[30639]
lrwx------ 1 us sudo 64 Sep 24 11:26 6 -> socket:[27522]
答案1
不是以干净或便携的方式。您必须附加一个调试器,例如gdb
,打开一些目标文件并将其复制到 fd 1 中。与
gdb -p <PID> -batch -ex 'call dup2(open("<PATH>", 2), 1)'
这pipe:[digits]
是一个“匿名”管道,由cmd | cmd
shell 构造创建。
然而在 Linux 上它并不是真正的匿名,因为你可以通过/proc/<PID>/fd/<NUM>
.所以你还有另一个选择(这肯定会造成更比使用gdb
) 造成的破坏:打开管道的另一侧,杀死从中读取的任何程序,并将cat
其删除到其他地方。愚蠢的例子:
% while sleep 1; do TZ=Zulu date; done | wc -c &
[1] 26727
% ps
PID TTY TIME CMD
20330 pts/1 00:00:00 bash
26726 pts/1 00:00:00 bash # this the while ... done process
26727 pts/1 00:00:00 wc
26745 pts/1 00:00:00 sleep
26746 pts/1 00:00:00 ps
% ls -l /proc/26726/fd/1
... /proc/26726/fd/1 -> 'pipe:[1294932]'
% exec 7</proc/26726/fd/1 # open the other side of the pipe
% kill 26727 # kill wc -c
% cat <&7
Fri 24 Sep 2021 01:25:52 PM UTC
Fri 24 Sep 2021 01:25:53 PM UTC
Fri 24 Sep 2021 01:25:54 PM UTC
...