我有一个脚本/venv/bin/activate
可以设置一些环境变量。我正在寻找一种方法来启动 zsh,让它获取此脚本,然后继续正常的交互式会话。当我退出此会话时,我返回的会话不应该知道所做的任何环境更改activate
。我怎样才能像这样调用zsh?
(这与这个,除了我使用的是 zsh 而不是 bash。)
答案1
如果activate
脚本仅设置环境变量,您可以在一个 shell 中读取它,然后执行一个新的交互式 zsh 实例。
sh -c '. /venv/bin/activate; exec zsh -i'
包装器 shellsh
可以替换为任何能够解析 的 shell /venv/bin/activate
,包括脚本zsh
是否activate
与其兼容。
除了环境变量之外,交互式 zsh 实例还将继承进程 ID 和一些其他进程设置,例如资源限制 ( ulimit …
) 和忽略信号 ( trap '' …
)。另一方面,shell 本身的设置不会被保留:shell 变量(var=…
如果var
未导出)、shell 选项(set -…
或shopt …
)、键绑定、别名和函数定义等。
.zshrc
显然,如果您覆盖脚本设置的环境变量,这将不起作用activate
。这就是原因之一.*shrc
文件不应设置环境变量。
答案2
使用ZDOTDIR
例如,创建一个(可能是临时的)目录,~/venv_startup
其中包含两个文件:.zshenv 和 .zshrc。 .zshenv 文件包含以下内容
source ~/.zshenv
source /venv/bin/activate
而 .zshrc 说
source ~/.zshrc
现在,通过调用 zsh
zsh -c "ZDOTDIR=~/venv_startup zsh"
这对 zsh 说,“不要从 中获取 .zshenv 和 .zshrc 文件开始$HOME
,而是从 中获取这些名称的文件/venv_startup
。”由于无论如何,源中的版本/venv_startup
都是如此$HOME
,最终效果是 shell 将运行
source /venv/bin/activate
在执行 zshenv 和 zshrc 之间。之后就是正常的交互会话了。