![将 stderr 重定向到第二个终端/tty](https://linux22.com/image/1447040/%E5%B0%86%20stderr%20%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E7%AC%AC%E4%BA%8C%E4%B8%AA%E7%BB%88%E7%AB%AF%2Ftty.png)
我曾尝试过rse
区分程序中的标准输出和标准错误流;但我真的很想选择同时查看这两个流独立航站楼,而无需重定向到文件并对其进行尾随或执行其他操作(我们假设其中一个流可以打印 ANSI 终端控制代码。)
有没有办法在新的终端中打开现有进程的标准错误,或者类似的东西?
答案1
打开两个终端。在第二个终端中,通过运行命令找出其 tty 设备tty
。它将打印类似以下内容的内容/dev/pts/8
。
在第一个方法中,运行您的应用程序并将其 stderr 重定向到这里,例如myapp 2>/dev/pts/8
。
我经常用这个来调试,所以我将终端标题设置为包含 tty 号,这样我甚至不必运行命令。我在 shell 提示符中执行此操作,将更改标题的转义序列与 bash 的tty 行号(小写的 L)tty
结合起来,即\l
PS1=$'\\[\e]0;\l\a\\] ...'
我经常在启动实际应用程序之前在第二个终端中执行cat
,以防万一我在那里意外输入了一些东西(这无伤大雅),并让光标转到第一列。但这不是强制性的。
答案2
我的第一反应是“不”,但后来我想到了这个丑陋的想法:
sh -c 'echo stdout; echo stderr >&2' 2> >(
errs=$(cat)
xterm -e "bash -c '
cat <<\"END\"
$errs
END
read -p DONE
'"
)
标准错误被重定向到进程替换,在那里收集内容然后传递给在 xterm 中执行的脚本。
我对自己能想到这个办法感到有点自豪,但更多的是感到尴尬。