使用多个选项卡和不同的命令打开新的 gnome-terminal (v3.28+)

使用多个选项卡和不同的命令打开新的 gnome-terminal (v3.28+)

Ubuntu 14(v3.6?)和 Ubuntu 18(v3.28)附带的版本之间 gnome-terminal 的行为似乎发生了变化。

我有一个脚本,它打开一个新的 gnome 终端,其中有一堆选项卡设置到不同的目录以供我开发,目前第一个选项卡运行一个脚本。使用选项卡打开 gnome 终端的命令如下所示:

gnome-terminal \
   --tab --command="myscript.sh" \
   --tab --working-directory="<some dir 1>" \
   --tab --working-directory="<some dir 2>" \
   ...

这在 Ubuntu 14(v3.6?)附带的 gnome-terminal 版本中完美地工作。

但在 Ubuntu 18 (v3.28) 附带的 gnome-terminal 版本中,有几件事发生了变化:

  1. 除非我添加该--window选项,否则选项卡将在当前的 gnome 终端中打开,而不是新的。不幸的是,添加该--window选项会打开一个初始空白选项卡。是否可以打开一个仅包含我指定的选项卡的新窗口?
  2. 我现在收到以下通知(尽管它的功能与以前一样):

    # Option “--command” is deprecated and might be removed in a later version of gnome-terminal.
    # Use “-- ” to terminate the options and put the command line to execute after it.
    

    根据本指南更改我的脚本会更改行为,以便将命令发送到所有选项卡,而在此之前我可以将唯一的命令应用于每个选项卡。这是否意味着每个选项卡运行单独命令的功能已被弃用,或者我是否遗漏了某些内容?

我很欣赏有关如何更改我的脚本以支持较新的 gnome 终端中的旧行为的建议。

答案1

这将打开多个选项卡。我认为将每个选项卡放在单独的行上会更干净。如果您想要每个窗口都有一个新窗口,请省略--tab

--请注意与over -e/ 的最大区别--command是参数不在引号中

gnome-terminal --title "Frontend Web App" --tab --working-directory ~/projects/front-end-app -- npm run serve
gnome-terminal --title "API Server" --tab --working-directory ~/projects/api-server -- ./run-local.sh

答案2

有点不幸的是 gnome-terminal 已弃用-e。这使得启动使用不同命令运行多个选项卡的实例变得很棘手。这是我的方法:

launch_project_foo在路径中的某个位置创建了一个可执行脚本。典型的项目启动文件可能如下所示:

#!/bin/bash

BASE_DIR=~/git/ProjectFooBaseDir

cat << EOF > /tmp/bootstrap_tabs.sh
gnome-terminal --tab -t "Docker" --working-directory="$BASE_DIR/backend" -- \
  zsh -is eval "docker-compose up"
gnome-terminal --tab -t "Backend" --working-directory="$BASE_DIR/backend" -- \
  zsh -is eval "npm start"
gnome-terminal --tab -t "Frontend" --working-directory="$BASE_DIR/frontend" -- \
  zsh -is eval "npm start"
gnome-terminal --tab -t "Git" --working-directory="$BASE_DIR"
EOF

gnome-terminal --window --maximize -- bash /tmp/bootstrap_tabs.sh

重要提示:这依赖于有一个评估挂钩.zshrc,如下所述。

一些注意事项:

  • gnome-terminal调用实际上为引导创建了一个“第零”选项卡,但由于它立即关闭,因此实际上无法观察到。如果您在引导脚本中放置睡眠,您就会明白我的意思。

  • 为了允许变量替换,heredoc 不得使用带引号的'EOF',请参阅在 bash 定界文档中使用变量

  • 最后一个选项卡创建一个用于正常工作的常规终端。

  • 其他选项卡不会直接启动进程,因为这样做意味着如果进程终止,选项卡就会消失。该问题的解决方案在某种程度上是特定于 shell 的。我在这里使用 zsh,并依赖于.zshrc.可以避免 eval 钩子并简单地使用 eg zsh -ic "<commands>; zsh -i"。然而,这有一个缺点,即当终止命令时CTRL + C(这对于无限运行的命令来说很常见,例如npm start),整个选项卡将关闭,因为外壳实例终止。使用 eval 钩子的方法避免了这种情况,并且即使在 SIGTERM 的情况下也允许保持选项卡打开。

  • 命令可以正常链接,在实践中,我经常用来sleep 10; npm start;等待另一个选项卡(如 docker-compose)中的某些内容准备好。

答案3

我遇到了同样的问题,经过大量尝试,我找到了以下解决方案

gnome-terminal -- bash -c "myCommand -some-args; bash"
gnome-terminal -- bash -c "myOtherCommand -some-args; bash"

答案4

恕我直言,最好的方法是忘记 gnome-terminal。相反,安装 mate-terminal,它是旧 gnome-terminal 的克隆,它保留了命名选项卡的能力等好东西...
这是我的启动脚本,它创建了三个命名选项卡,每个选项卡都可以位于不同的位置目录...

#!/bin/bash
mate-terminal \
--hide-menubar \
--geometry=130x12+1+800 \
--tab -t "vpn" \
    --tab -t "home" \
    --tab --working-directory="/ddr/buppo/bw/bw-b/sn" -t "sn"

相关内容