我正在从启动脚本启动 URxvt 终端。当终端启动时,我想在加载了特定 Python virtualenv 的特定目录中工作。这些是在已经运行的终端中完成此操作的命令:
$ cd myproject
$ workon myvirtualenv
现在,启动这个终端需要什么命令?这是我尝试过的:
# called from startup script:
/usr/bin/urxvt -e bash -ic 'cd myproject; workon myvirtualenv'
这行得通,但这几乎不引人注意,因为这两个命令一完成,终端就会退出,这几乎是立即的。bash
我可以通过再次调用来防止这种情况发生,如下所示:
# called from startup script:
/usr/bin/urxvt -e bash -ic 'cd myproject; workon myvirtualenv; exec bash -i'
但是现在在 bash 的第二个实例中不再激活 virtualenv,尽管cd
命令的效果确实存在。
如何使用激活的 virtualenv 生成 URxvt 终端?
workon
是一个函数(不是单独的可执行文件),原因是:它的工作是在当前 shell 中设置一些东西。我不使用该工具,也不知道细节。它是否设置变量、函数、别名、陷阱、shell 选项或其他任何东西都无关紧要。重要的是,当您运行时exec bash -i
,会重新bash
开始,并且至少其中一些自定义设置不会被保留。解决方案:让这个精确的
bash -i
运行workon myvirtualenv
自己。这个想法是
exec bash -i
在某个环境变量的存在和内容会告诉 shell 运行的环境中运行workon …
。将此添加到您的~/.bashrc
:它必须在定义后执行。
workon
你的最末端~/.bashrc
很可能是最好的地方。urxvt
以这种方式运行:笔记:
第一个外壳不需要是
bash
; 它不需要是交互式的。我用过sh -c …
,应该没问题。AUTOWORKON
将在 的环境中bash
,因此如果您运行另一个bash
读取,~/.bashrc
那么它也workon …
将从文件中的我们的行执行。我不知道你是否想要这个。如果没有,unset AUTOWORKON
在~/.bashrc
使用它的值之后。将我们的行更改为:另一种可能性是从变量中删除导出属性:
export -n AUTOWORKON
.我随意选择
AUTOWORKON
了变量的名称。如果它与您当前设置中的任何内容发生冲突,请使用其他名称。我找到了另一个选择。非常感谢卡米尔让我走上了正确的道路!以下命令将生成一个不会立即退出的新终端:
解释:
urxvt
: 启动 URxvt。-e bash --rcfile ...
:启动时,bash
使用--rcfile
参数执行。这将获取后面的文件名而不是默认.bashrc
文件。<(echo ...)
: Process Substitution的特殊 bash 语法。这会将括号内的命令替换为文件名,例如/dev/fd/62
包含命令输出的文件描述符。您可以使用它为不允许标准输入的命令提供文件名,例如bash --rcfile
'. /etc/bash.bashrc; . ~/.bashrc; cd myproject; workon myvirtualenv'
: 即时生成的 rcfile 的内容。这包含在 shell 接受常规用户输入之前发生的实际命令。由于此命令使用仅在 bash 中可用的语法,因此它只能从 bash shell 运行。以下稍微复杂的命令适用于任何 shell:
这将更适合典型的启动命令,例如 in
~/.xsessionrc
或~/.xinitrc
.