如何将命令发送到特定的终端窗口?

Ali*_*adi 15 command-line bash scripts gnome-terminal


我想编写一个脚本,用于在不同的终端中同时打开多个程序(服务器)——不管是哪一个——并将不同的命令分配给不同的终端,命令“登陆”在正确的终端内。这可能吗?
也许,像这样:

  1. 打开终端1
  2. 打开终端2 //与1同时。
  3. command1 //在终端1中执行而不打开新的终端窗口
  4. command2 //在终端2中执行而不打开新的终端窗口
  5. ...

我可以以某种方式标记终端窗口,以便在正确的终端内执行命令吗?

我还想在他们的程序运行时观察所有终端 - 我的程序有一个参数来将跟踪/调试打印到终端。所以我想看看他们之间交换了什么消息。

注意:我不太关心交换数据的安全性,因为这个脚本应该作为一个“模拟”。我已将每个服务器配置为从本地主机上的分配端口运行。

Jac*_*ijm 15

由于您提到您解决了针对您的特定情况的问题,因此下面是通用解决方案。感谢xdotool--sync选项,它在我运行的测试中非常可靠;我可以将命令“发送”到特定的终端窗口,它毫无例外地完美运行。

在实践中如何运作

该解决方案存在于脚本中,该脚本可以使用两个选项运行, -set并且-run

  1. 设置(打开)任意数量的终端窗口,在本例中为 3:

    target_term -set 3
    
    Run Code Online (Sandbox Code Playgroud)

    三个新终端将打开,它们的窗口 ID 被记住在一个隐藏文件中:

    在此处输入图片说明

    为清楚起见,我最小化了我从 :) 运行命令的终端窗口

  2. 现在我创建了三个窗口,我可以使用运行命令向其中之一发送命令(例如):

    target_term -run 2 echo "Monkey eats banana since it ran out of peanuts"
    
    Run Code Online (Sandbox Code Playgroud)

    如下图,命令在第二个终端运行:

    在此处输入图片说明

    随后,我可以向第一个终端发送命令:

     target_term -run 1 sudo apt-get update
    
    Run Code Online (Sandbox Code Playgroud)

    使sudo apt-get update运行在终端1:

    在此处输入图片说明

    等等...

如何设置

  1. 该脚本需要wmctrlxdotool

    sudo apt-get install wmctrl xdotool
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将下面的脚本复制到一个空文件中,将其保存为target_term(无扩展名!)~/bin~/bin如有必要,请创建目录。

  3. 使脚本可执行(不要忘记)并注销/登录或运行:

    source ~/.profile
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在设置您的终端窗口,以所需窗口的数量作为参数:

    target_term -set <number_of_windows>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在,您可以使用以下命令向任一终端“发送”命令:

    target_term -run <terminal_number> <command_to_run>
    
    Run Code Online (Sandbox Code Playgroud)

剧本

target_term -set 3
Run Code Online (Sandbox Code Playgroud)

笔记

  • 该脚本设置为gnome-terminal,但可以通过更改application脚本头部部分中的用于任何终端(或其他程序):

    target_term -run 2 echo "Monkey eats banana since it ran out of peanuts"
    
    Run Code Online (Sandbox Code Playgroud)
  • 上面的命令(当然)也可以从脚本中运行,以防您想将它用于某种模拟。
  • 脚本会一直等到目标窗口都获得焦点并且命令输入完毕,因此命令将始终位于正确的终端窗口中。
  • 无需说该脚本仅适用于命令调用的终端设置(windows):

    target_term -set
    
    Run Code Online (Sandbox Code Playgroud)

    然后终端窗口将被脚本“标记”,就像您在问题中提到的那样。

  • 如果您开始新target_term会话,脚本创建的隐藏文件将被简单地覆盖,因此无需将其删除。