以编程方式打开gnome终端并在执行bashrc之后执行命令


35

为了启动我的开发环境,我编写了一个小脚本。一部分是打开带有多个选项卡的gnome终端,在其中应自动执行一些命令。其中一些命令取决于已经执行的.bashrc。但是当使用

gnome-terminal --tab -e“命令” --tab --tab

该命令在执行.bashrc之前执行。是否有可能使自动gnome-terminal表现得像手动使用的gnome-terminal?(甚至“ cd / foo / bar”之类的命令也不适用于gnome-terminal -e)

Answers:


45

一旦gnome-terminal开始执行bash,就命令执行而言,它就处于循环之外:它仅管理输入和输出。因此,您需要bash的合作才能~/.bashrc在加载后运行某些程序。

首先,在很多情况下,您实际上不需要在之后执行命令~/.bashrc。例如,使用即可简单地在特定目录中打开终端cd /foo/bar && gnome-terminal。您可以通过类似的方式设置环境变量:VAR=value gnome-terminal。(如果您~/.bashrc覆盖环境变量,那么您做错了:环境变量定义属于~/.profile

要在终端中执行命令,但在之前~/.bashrc,您可以执行

gnome-terminal -x sh -c 'command1; command2; exec bash'

如果要使用多个标签,则必须使用-e代替-x。Gnome-terminal会无助地拆分-eat 参数,而不是通过shell执行。但是,如果确保不在其中包含空格,则可以编写shell命令。至少在gnome-terminal 2.26上,您可以使用制表符(用<TAB>文字制表符代替):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

如果你需要运行后命令~/.bashrc,使得运行的命令。例如,在末尾包含以下代码~/.bashrc

eval "$BASH_POST_RC"

然后在您的bashrc之后(确实在结尾)运行一些代码:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

或(报价不太重)

BASH_POST_RC='command1; command2' gnome-terminal

尽管我不特别推荐这样做,但是您可能会对如何启动已经在命令行上输入某些文本的终端机中提到的技术感兴趣


是的,确实是个不错的把戏。没想到。现在,我必须找到一种方法为特定选项卡设置不同的BASH_POST_RC变量。这似乎仍然是一个问题。一个简单的“ gnome-terminal --tab -e'BASH_POST_RC = ls'--tab”是不可能的:-(
Zardoz 2010年

@Zardoz:实际上,您可以使用制表符来欺骗gnome-terminal(请参阅我的修订答案)。注意多个级别的报价。
吉尔(Gilles)'所以

..它有效:-) ...非常感谢您的解决方案和耐心等待。这是我完整的命令(即使使用命令中的空格也可以使用:gnome-terminal --working-directory =“ / home / zardoz / projects / my_rails_app” --tab -e'bash -c“ export BASH_POST_RC = \” rails服务器\“; exec bash”'--tab -e'bash -c“ export BASH_POST_RC = \” autotest \“; exec bash”'
tab

终于使它工作了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。这是我的,使用zsh并立即打开服务器和控制台:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
Augustin Riedinger 2013年

1
@terdon不,gnome-terminal -e根本不调用shell。如果运行gnome-terminal -e 'sleep 9',它将sleep使用参数执行命令9,并且不涉及任何外壳程序。如果执行,gnome-terminal -e 'sleep 9;bash'则终端会打开并立即关闭,因为会sleep抱怨这9;bash不是有效的时间间隔。您可以观察到发生了什么事strace -f -eexecve gnome-terminal -e …
吉尔斯(Gilles)'所以

6

当使用该-e选项时,gnome-terminal将在不启动新外壳的情况下运行该命令(甚至可以gnome-terminal -e gedit运行以下命令:),因此,如果要将命令运行到bash外壳中的新终端/选项卡中,则必须执行以下操作:

gnome-terminal -x bash -c "command"

但是请注意,"command"结束时终端/标签也将结束。


1
我想你的意思是gnome-terminal -x bash -c "command"-e期望有一个论点)。而且command,至少在启动单个选项卡之后,执行Shell相当简单-请参阅我的回答
吉尔(Gilles)“所以

gnome-terminal -x "bash" -c "command"为我工作。注意-x arg值上的引号。
m3nda

我得到# Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo

1
拜托,自-x-e弃用以来,我们该怎么办???
nyxee

我相信这不会~/.bashrc像OP最初要求的那样在执行命令之前运行。
IgNite
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.