【问题标题】:Shell script: open multiple terminals and run commands?Shell脚本:打开多个终端并运行命令?
【发布时间】:2016-04-17 18:58:26
【问题描述】:

我正在尝试创建一个非常简单的 shell 脚本,它可以打开并运行我的程序的五个实例。使用批处理,我会做这样的事情:

@echo off
python webstore.py 55530
python webstore.py 55531
python webstore.py 55532
exit

这将打开三个终端并使用不同的命令行参数在每个终端上运行命令。如何使用在每个基于 unix 的平台上运行的 shell 脚本创建相同的脚本?我见过一些打开终端的命令,但它们是特定于平台的(gnome-termial、xterm 等)。

【问题讨论】:

  • 我不知道完美的解决方案。您可以通过 $SHELL 环境变量获取默认 shell,但打开新终端与打开新终端 window 不同 - 使用 exec "$SHELL" 打开新 shell 不应打开新终端窗口。您可以使用 sudo apt-get install xdotoolxdotool key ctrl+shift+n - 这可能是一个有点“跨发行版”的解决方案,因为大多数窗口管理器都支持 ctrl+shift+n 来打开新窗口
  • 检查this out(使用xdotool打开三个终端窗口并向它们发送命令)

标签: linux bash shell


【解决方案1】:

如何使用在每个基于 unix 的平台上运行的 shell 脚本创建相同的脚本?

你的要求有点不合理。这样想:在 Windows 上,你总是在它的 Desktop Window Manager 中,而你唯一的选择是在 Powershell 和 cmd.exe 之间。但在 Linux 上,情况稍微复杂一点:

  1. 如您所说,您可以安装 rxvtxterm
  2. 但这不是唯一的问题 - 您可以使用任何窗口管理器。虽然这在这里无关紧要,
  3. 您可以使用 Xorg 或 Wayland。继续,
  4. 您根本不能使用任何图形环境,例如在 Linux 控制台中运行一切!除非您使用诸如 fbtermtmux 之类的花哨程序,否则它几乎无法进行多任务处理,但只能产生新窗口。
  5. 话虽如此,您甚至可能根本不实际使用这台计算机,因为您是从 SSH 连接到它的。这里也没有远程窗口(除非你使用东西作为 X11 转发)。
  6. 最后,您可以使用zshbashshfish 等,它们都有自己的特点。

IMO 你最好的选择是在你的脚本中测试安装了哪些程序,或者围绕终端多路复用器编写脚本,例如tmux,并要求它安装在目标机器上。 tmux 在行动:


(来源:github.io

(这将适用于 SSH、Linux 控制台或上述任何其他场景。)

但是,如果您不关心即将运行的命令的输出,您可以像这样将它们从当前的终端会话中分离出来:

command1 &>/dev/null &
command2 &>/dev/null &
command3 &>/dev/null &

请注意:

  1. 将并行运行命令。
  2. 不会显示任何输出。如果您删除&>/dev/null,每个命令的输出将相互交织,这可能不是您想要的。
  3. 关闭终端通常会杀死其子进程,在这种情况下,会杀死在后台工作的 command 实例。

上面提到的问题可以解决,但我认为这有点超出了这个答案的范围。

根据我是否需要查看控制台输出,我个人会选择tmux 或分离解决方案。

【讨论】:

  • 最后一个列表中的第2点可以使用nohup来解决,不是吗?
  • 是的,但我认为这有点超出了问题的范围——我只是想简要介绍一下 OP 可能的选项,而不做太多详细说明。