为了启动我的开发环境,我写了一个小脚本。其中一部分是打开一个带有多个选项卡的 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"
结束时终端/标签也将结束。