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

Zar*_*doz 37 bash bashrc gnome-terminal

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

gnome-terminal --tab -e "command" --tab --tab

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

Gil*_*il' 50

一旦 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'
Run Code Online (Sandbox Code Playgroud)

如果要使用多个选项卡,则必须使用-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'
Run Code Online (Sandbox Code Playgroud)

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

eval "$BASH_POST_RC"
Run Code Online (Sandbox Code Playgroud)

然后在你的 bashrc 之后(实际上,在最后)运行一些代码:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'
Run Code Online (Sandbox Code Playgroud)

或(引用较少)

BASH_POST_RC='command1; command2' gnome-terminal
Run Code Online (Sandbox Code Playgroud)

虽然我并不特别推荐这样做,但您可能对如何使用已在命令行上输入的某些文本启动终端中提到的技术感兴趣 .

  • @terdon 不,`gnome-terminal -e` 根本不调用 shell。如果你运行 `gnome-terminal -e 'sleep 9'`,它会执行带有参数 `9` 的命令 `sleep`,并且不涉及 shell。如果你执行 `gnome-terminal -e 'sleep 9;bash'` 然后终端立即打开和关闭,因为 `sleep` 抱怨 `9;bash` 不是一个有效的时间间隔。你可以用 `strace -f -eexecve gnome-terminal -e ...` 观察发生了什么 (2认同)

cYr*_*rus 6

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

gnome-terminal -x bash -c "command"
Run Code Online (Sandbox Code Playgroud)

但请注意,当"command"结束时终端/选项卡也会结束。