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

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

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

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

该命令在 .bashrc 执行之前执行。是否有可能使自动 gnome-terminal -e 的行为像手动使用的那样?(即使像“cd /foo/bar”这样的命令也无法与 gnome-terminal -e 一起使用)

答案1

一旦 gnome-terminal 启动了 bash,它就不再参与命令执行:它只管理输入和输出。因此,在~/.bashrc加载后,您需要 bash 的配合才能运行某些操作。

首先,在很多情况下,你实际上并不需要执行命令~/.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 会将 的参数拆分为-e空格,而不是通过 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

虽然我不建议这样做,但你可能会对 如何启动已在命令行输入某些文本的终端?

答案2

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

gnome-terminal -x bash -c "command"

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

相关内容