Nik*_*chi 7 linux unix terminal redirection tty
我已经进入了一个 linux 机器,我正在使用 dvtm 和 bash(虽然我也尝试过使用 Gnu screen 和 bash)。我有两个终端,当前的 /dev/pts/29 和 /dev/pts/130。我想将输入从一个重定向到另一个。
据我了解,在 /dev/pts/130 中,我可以输入:
cat </dev/pts/29
Run Code Online (Sandbox Code Playgroud)
然后当我输入 /dev/pts/29 时,我输入的字符应该会出现在 /dev/pts/130 中。然而,最终发生的是我输入的每个其他字符都被重定向。例如,如果我输入“你好”,我会得到这个:
/dev/pts/29 | /dev/pts/130
$ | $ cat </dev/pts/29
$ el | hlo
Run Code Online (Sandbox Code Playgroud)
这真的很令人沮丧,因为我需要这样做以重定向在 gdb 中运行的进程的 io(我已经尝试过运行 /dev/pts/# 并设置低级 tty /dev/pts/# 并且都导致上述行为)。我做错了什么,还是 bash/screen/dvtm 中的错误?
在您的简化示例中,您有两个进程(您的 shell 和cat)试图从 tty 的“从”端读取。结果是一个进程获取一些字符,另一个进程获取其他字符。
“将输入从一个[终端]重定向到另一个”是什么意思?在您的实际情况中,哪些进程试图从每个终端读取?一旦获得了捕获的输入,您想用它做什么?什么,究竟,你实际上是想实现什么?
对我来说,“重定向在 gdb 中运行的进程的 io”似乎更像是在已经运行的进程中重新打开 stdin/stdout/stderr。
您可以使用(除其他外)GDB更改正在运行的进程的 stdin/stdout/stderr 。对“使用命令行重定向进程启动后的 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
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18530 次 |
| 最近记录: |