将输入从一个终端重定向到另一个终端

Modified on: Thu, 07 Feb 2019 22:20:02 +0800

我已经进入了一个linux盒子,我正在使用dvtm和bash(虽然我也尝试过使用Gnu屏幕和bash)。我有两个终端,当前/ dev / pts / 29和/ dev / pts / 130。我想将输入从一个重定向到另一个。

根据我的理解,在/ dev / pts / 130中我可以输入:

cat </dev/pts/29

然后当我输入/ dev / pts / 29时,我输入的字符应显示在/ dev / pts / 130中。然而,最终发生的事情是我输入的每个其他字符都被重定向。例如,如果我输入“hello”,我会得到这个:

/dev/pts/29        |        /dev/pts/130

$                  |        $ cat </dev/pts/29
$ el               |        hlo

这真是令人沮丧,因为我需要这样做才能重定向在gdb中运行的进程的io(我已经尝试了运行/ dev / pts /#并设置了inferior-tty / dev / pts /#和两者都导致上述行为)。我做错了什么,或者这是bash / screen / dvtm中的错误?

最佳答案

在您的简化示例中,您有两个进程(您的shell和 cat )尝试从tty的“slave”端读取。结果是一个进程获得了一些角色,另一个获得了其他角色。

“将输入从一个[终端]重定向到另一个”是什么意思?在您的实际情况中,哪些进程试图从每个终端读取?一旦拥有它,你想用你捕获的输入做什么?您实际上想要完成什么,完全

对我来说,“重定向在gdb中运行的进程的io”似乎更像是在已经运行的进程中重新打开stdin / stdout / stderr。

您可以使用(在其他内容中)更改正在运行的进程的stdin / stdout / stderr)GDB。 答案“使用命令行重定向进程后的STDERR / STDOUT?”显示了如何完成它。您可能希望在答案中替换/dev/null的tty路径名,并且您可能也希望处理stdin,但该技术仍然适用。


你应该能够使你的简化示例有效地工作,但我不相信它会做你真正想做的事情(请记住伪终端实际上是一对设备,就像双向管道的两端一样;但是你的所有例子都与”奴隶“一半交互。)

修复你的例子的关键是让一个竞争过程中的所有过程(暂时)停止从终端读取。如果像你的例子一样,你有一个shell想要捕获数据,那么你可以这样做:

( s="$(stty -g)" exec 3&lt;&amp;0 trap 'stty "$s" 0&lt;&amp;3;exit' 0 INT QUIT cat &lt;&lt;EOM In some other terminal, run the command cat &lt;$(tty) Press ^C or ^\ to quit. EOM stty raw isig brkint susp '' dsusp '' while true; do sleep 3600; done &lt;/dev/null )


相关问答

添加新评论