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 版本中,有几件事发生了变化:
- 除非我添加该
--window
选项,否则选项卡将在当前的 gnome 终端中打开,而不是新的。不幸的是,添加该--window
选项会打开一个初始空白选项卡。是否可以打开一个仅包含我指定的选项卡的新窗口? 我现在收到以下通知(尽管它的功能与以前一样):
# 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 钩子并简单地使用 egzsh -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"