是否可以将数据发送到另一个伪终端的外壳?

是否可以将数据发送到另一个伪终端的外壳?

下图显示了伪终端的工作原理:

在此输入图像描述

如果我打开了两个终端模拟器,我可以将字符串"Hello"从第一个终端模拟器发送到第二个终端模拟器:

echo "Hello" > /dev/pts/1

当执行该命令时,字符串"Hello"将从第二个伪终端的从机端传输到第二个伪终端的主机端,然后显示在第二个终端仿真器上。

现在是否可以向相反的方向发送数据,即将数据发送到shell而不是终端仿真器(或shell正在运行的进程)?

答案1

它可能不完全是您正在寻找的,但我通常通过在终端中运行屏幕会话来解决此类问题。

我这样做:

  • 在终端 1 中,我启动一个名为的新屏幕会话术语1通常screen -S term1
    ,当我需要此功能时,终端 1 还不存在。在这种情况下,我在新终端中创建会话xterm -e screen -S term1 & ; disown
    您可能想知道& ; disown.这是因为我希望在 xterm 启动后返回 shell,并且xterm如果我启动它的 shell 死掉了,我也不想死
  • 我在第二个终端中执行类似的操作:(screen -S term2或通过运行创建一个新终端xterm -e screen -S term2 & ; disown
  • 现在通讯工作如下:
    • 您可以使用如下命令从任何地方(包括终端 2)向第一个终端发送文本:
      screen -S term1 -X stuff 'echo "foo"\n'
      结果与echo "foo"在第一个终端输入并按Enter
    • 更简单的示例:发送输入some words,但是不是跟随它Enter到 2 号航站楼,您可以使用screen -S term2 -X stuff 'some words'

旁注:

  • 如果您已经命名了屏幕会话term1和/或term2使用其他名称
  • 如果您screen -S somename在已经存在的终端中运行,请注意,运行后只有屏幕会话会被终止exit
    如果您希望整个终端停止,请screen -S somename ; exit改为使用。
    这在新创建的终端中是不必要的。

答案2

TIOCSTI 的工作原理如评论中所述特里格多于:https://stackoverflow.com/a/29615101/2995591

答案3

每个进程有3个默认的“文件描述符”

0 is stdin  (standart input)
1 is stdout (standart output)
2 is stderr (standart error output)

您需要找到 shell 进程的 PID,然后您可以执行以下操作:

echo "test" > /proc/{your_shell_pid}/fd/1

这将在 shell 进程的标准输出中打印测试

相关内容