如何启动一个新的 zsh 实例来获取特定文件?

如何启动一个新的 zsh 实例来获取特定文件?

我有一个脚本/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 之间。之后就是正常的交互会话了。

相关内容