我需要打开多个终端选项卡,为它们指定标题,转到一个目录,并让每个选项卡运行一个命令。
我是 Linux 和 Shell 脚本的新手,在网上搜索并检查了一些解决方案后,我编写了这个脚本(已编辑根据以下答案):
#!/bin/bash
cd /media/Extra/Project
tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)
cmds[1]="'rails s'"
titles[1]="Server"
cmds[2]="'rails c'"
titles[2]="Console"
for i in 1 2; do
options+=($tab --title="${titles[i]}" -e "bash -c \"${cmds[i]} ; bash\"" )
done
gnome-terminal "${options[@]}"
exit 0
它打开选项卡并命名它们,但无法执行生成此错误的命令:
为此终端创建子进程时出错
另一个缺点是,如果我停止正在运行的命令,它会关闭选项卡,而这并不是我想要的。我需要能够停止命令并在同一个选项卡中再次运行它。
脚本有什么问题?还有其他更简单的方法吗?
注意:如果我从命令中删除了 (-e "\"bash -c ${cmds[i]} ;bash\"") 部分,它会打开给定目录中的选项卡并命名它们,并且没有任何错误。
-编辑-1:
在应用下面的@Tuknutx 答案并编辑脚本后,错误不再出现,但它给了我bash: rails c: command not found
并rails s
创建了一个新的 rails 应用程序而不是启动 rails 服务器,我在访问此文件夹后使用 .rmvrc 来选择一个 gemset。
答案1
我建议tmux
使用tmuxinator
,它会为您完成这项工作,并且您也可以依赖terminator
布局!
对于terminator
布局检查 mhnagaoka 的答案这里askubuntu 也一样:
设置布局后,右键单击任意终端背景并选择优先→布局选项卡并点击 添加按钮。
给它命名并点击关闭。
这应该会创建上述
~/.config/terminator/config
文件。现在,您可以使用保存的布局启动终结器:(
terminator -l yourLayout
替换你的布局与您在步骤 2 中选择的任何内容相同)。(选修的)编辑
~/.config/terminator/config
文件,使其显示[layouts]
并嵌套在其下方[[yourLayout]]
,重命名 你的布局到默认并删除/重命名前一个默认布局。现在,当 Terminator 不带任何参数启动时,它将加载您的自定义[[default]]
布局!
答案2
总结一下其他几个答案和他们的评论,我得出的结论如下:
#!/bin/bash
cd /path/of/my/stuff
tab=" --tab"
options=()
cmds[1]="echo Banana"
cmds[2]="echo Cat"
for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done
gnome-terminal "${options[@]}"
exit 0
请注意,我删除了“主”选项卡、配置文件和标题(这些似乎已被弃用gnome-terminal
)。
答案3
尝试这个:
options+=($tab --title="${titles[i]}" -e "bash -c \"${cmds[i]} ; bash\"" )
否则 -e 后面的整个表达式将被解释为命令。
要包含 .bashrc 中的别名,请-ic
使用c
答案4
您为 -e 选项提供的参数"bash -c command; bash"
包括引号。它将整个字符串解释为命令的名称!请尝试以下方法:-e "bash -c 'command ; bash'"
。这样,您的终端窗口上运行的是 command
,运行之后,您将获得一个子 shell,我认为这就是您想要的。顺便说一句,您也可以说'command & bash'
;这将在后台运行命令并立即为您提供子 shell。