打开多个终端选项卡并运行命令


9

我需要打开多个终端选项卡,给它们标题,进入目录,并使每个选项卡运行一个命令。

我是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 foundrails s一旦该文件夹被访问创建一个新的Rails应用程序启动轨服务器而不是,我使用.rmvrc选择宝石。


如果要使脚本在ubuntu引导上运行:-您可以将脚本作为新贵服务运行(help.ubuntu.com/community/UbuntuBootupHowto),或者:在桌面环境中使用“启动应用程序”
Aboelnour

如果我写cmds[1]="'ping 192.168.9.9'"它给我同样的错误,但我通过删除单引号解决了它。所以,如果我写cmds[1]="ping 192.168.9.9"它的作品。
黛西

@Brary,但我不明白为什么要打开三个选项卡-一个默认选项卡,另外两个在脚本中设置。因为我们定义了tab=" --tab-with-profile=Default"??
黛西

Answers:


3

我建议使用tmuxwith tmuxinator,它将为您完成工作,您也可以依赖terminator布局!

对于terminator布局签出mhnagaoka的答案也在这里 askubuntu:

  1. 设置好布局后,右键单击任何终端背景,然后选择“首选项” →“ 布局”选项卡,然后单击“ 添加”按钮。

  2. 给它起一个名字,然后点击Close

  3. 这应该创建提到的~/.config/terminator/config文件。

  4. 现在,您可以使用以下保存的布局启动终止符:(terminator -l yourLayoutyourLayout替换为在步骤2中选择的内容)。

  5. (可选)编辑~/.config/terminator/config文件,以使其在[layouts]下面说出并嵌套在其下[[yourLayout]],将yourLayout重命名 为default并删除/重命名以前的默认布局。现在,当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)。


$tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal.使用“-” 的输出终止选项,并在其后放置命令行以执行。. that's an output but the comands get executed. When i use $ tab-`命令未执行,终端dsisplays播放:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee

1

尝试这个:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

否则,-e之后的整个表达式将被解释为命令。

要包含.bashrc中的别名,请使用-ic代替c


该错误不再出现,谢谢。但这给了我,bash: rails c: command not found并且“ rails s”创建了一个新的rails应用程序,而不是启动rails服务器。这就改变了问题的范围,我将用脚本的ur修改对其进行编辑
Brary

如果您rails c在没有其他任何东西的终端上尝试,是否奏效?也许应该是rails -c
TuKsn 2014年

尝试了没用。我什至试过了rvm list gemsets,它说No command 'rvm' found.. rvm list gemsets在打开的第一个选项卡中运行相同的命令,而没有运行命令,它起作用了!是否在环境加载和.rvmrc文件加载之前运行命令?
Brary 2014年

1

您为-e选项提供的参数"bash -c command; bash"包括引号。它将整个字符串解释为命令的名称!请尝试以下方法:-e "bash -c 'command ; bash'"。这样,在您的终端窗口上运行的是 command,然后运行,您将获得一个子外壳,我认为这是您想要的。顺便说一句,您也可以说'command & bash';这将在后台运行命令,并立即为您提供子外壳。


我把它options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )改成了options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" ),它给了我同样的错误..我做对了吗?
Brary

不太正确:在第一个bash之前删除\“,在第二个bash之后删除'。
Silvio Levy

谢谢,我编辑了问题,并将其范围更改为包括rails和rvm。
Brary
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.