假设您打开了一个 PID 为 6350 的终端仿真器 (T1)。
从另一个终端输入以下命令 (C1):
echo "ls\n" > /proc/6350/fd/0
这会ls
在 T1 中写入新行,但不会执行它。为什么?
我也尝试使用cat|bash
withecho "ls\n" > /proc/catid/fd/0
但它仍然没有执行。
如何将命令回显到另一个终端并执行该命令?
可能的答案:
$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;
在这种情况下,您不能再直接在终端中写入(所有内容的显示方式与命令 (C1) 在该终端中显示内容的方式相同。
答案1
有一个名为的命令行实用程序ttyecho
,可以将命令发送到另一个终端(tty/pts)并执行该命令。
sudo ttyecho -n /dev/pts/5 ls
看:用于向其他终端发送命令或数据的实用程序 (tty/pts)
另请参阅:ttyecho
github上的源代码。
另一个有趣的 tty 命令是selector
,它是控制台中的实时交互式模式匹配器,用于更新 tty 输入缓冲区。
# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)
答案2
/dev/pts/X
当您向( /proc/6350/fd/0
,1
只是其符号链接)发出写入操作2
时,发生的情况与进程(或其子进程之一,适当分叉)输出某些内容时发生的情况完全相同6350
:它写入终端。
如果你尝试读从该设备 ( cat < /dev/pts/X
) 中,将会发生一些奇怪的事情。您应该会看到您在原始 shell 中键入的内容显示出来。 (很可能只有在您输入的第一行新行之后 - 我猜测终端程序(xterm
或您正在使用的任何程序)会进行一些行缓冲,并且6350
被阻止的 shellread
会获取该部分;然后 shell 可能会,或者可能不,赢得后续阅读,但我很可能在这一点上完全错误。)
问题是:当您从该设备读取或写入该设备时,您并没有与使用该设备的其他 shell 进行通信。您正在与终端模拟器交谈(xterm
例如)。只有终端模拟器才能将数据注入该通道(shell 读取的数据),并且 shell 写入的所有内容都会发送到终端。安装第二个外壳并不会改变这一点。
如果您想将命令注入该6530
进程,则必须通过终端(无论是 X11 应用程序还是其他应用程序)来执行此操作。