我已经通过 ssh 进入 Linux 机器,并且正在使用 dvtm 和 bash(尽管我也尝试过使用 Gnu screen 和 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/# 和设置 superior-tty /dev/pts/#,都导致了上述行为)。我做错了什么,还是这是 bash/screen/dvtm 中的一个错误?
答案1
在您的简化示例中,您有两个进程(您的 shell 和猫) 尝试从 tty 的“从属”端读取。结果是一个进程获取一些字符,另一个进程获取其他字符。
“将输入从一个 [终端] 重定向到另一个”是什么意思?在实际情况下,哪些进程正在尝试从每个终端读取数据?一旦获得捕获的输入,您想如何处理它?什么,确切地,您究竟想要实现什么?
对我来说,“重定向在 gdb 中运行的进程的 io”看起来更像是在已经运行的进程内重新打开 stdin/stdout/stderr。
您可以使用以下方式更改正在运行的进程的 stdin/stdout/stderr(其中其他事情)GDB。“在进程启动后,使用命令行重定向进程的 STDERR / STDOUT?”的答案显示了如何完成。您可能希望/dev/null
在答案中替换 tty 路径名,并且您可能还希望处理 stdin,但该技术仍然适用。
你应该能够让你的简化示例稳健地工作,但我并不确信它能做你真正想做的事情(请记住伪终端实际上是一对设备,就像双向管道的两端;但您的所有示例都与“从属”两半进行交互)。
修复示例的关键是让除一个竞争进程之外的所有进程(暂时)停止从终端读取。如果像示例一样,您在要捕获数据的一侧运行了一个 shell,那么您可以执行以下操作:
(
s="$(stty -g)"
exec 3<&0
trap 'stty "$s" 0<&3;exit' 0 INT QUIT
cat <<EOM
In some other terminal, run the command
cat <$(tty)
Press ^C or ^\ to quit.
EOM
stty raw isig brkint susp '' dsusp ''
while true; do sleep 3600; done </dev/null
)