bdesham Asked: 2019-09-07 11:39:00 +0800 CST2019-09-07 11:39:00 +0800 CST 2019-09-07 11:39:00 +0800 CST 如何启动一个新的 zsh 实例来获取特定文件? 772 我有一个脚本/venv/bin/activate可以设置一些环境变量。我正在寻找一种方法来启动 zsh,让它获取这个脚本,然后继续正常的交互式会话。当我退出此会话时,我返回的会话不应该知道所做的任何环境更改activate。我怎样才能像这样调用zsh? (这与这个问题几乎相同,只是我使用的是 zsh 而不是 bash。) zsh 2 个回答 Voted Best Answer Gilles 'SO- stop being evil' 2019-09-07T12:23:19+08:002019-09-07T12:23:19+08:00 如果activate脚本只设置环境变量,您可以在一个 shell 中读取它,然后执行一个新的交互式 zsh 实例。 sh -c '. /venv/bin/activate; exec zsh -i' 包装器外壳sh可以替换为任何能够解析的外壳/venv/bin/activate,包括脚本zsh是否activate与其兼容。 除了环境变量之外,交互式 zsh 实例还将继承进程 ID 和一些其他进程设置,例如资源限制 ( ulimit …) 和忽略信号 ( trap '' …)。另一方面,不保留 shell 本身的设置:shell 变量(var=…如果var未导出)、shell 选项(set -…或shopt …)、键绑定、别名和函数定义等。 .zshrc显然,如果您覆盖activate脚本设置的环境变量,这将不起作用。.*shrc这就是文件不应该设置环境变量的原因之一。 bdesham 2019-09-07T11:39:00+08:002019-09-07T11:39:00+08:00 使用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 之间。之后,这将是一个正常的交互会话。
如果
activate
脚本只设置环境变量,您可以在一个 shell 中读取它,然后执行一个新的交互式 zsh 实例。包装器外壳
sh
可以替换为任何能够解析的外壳/venv/bin/activate
,包括脚本zsh
是否activate
与其兼容。除了环境变量之外,交互式 zsh 实例还将继承进程 ID 和一些其他进程设置,例如资源限制 (
ulimit …
) 和忽略信号 (trap '' …
)。另一方面,不保留 shell 本身的设置:shell 变量(var=…
如果var
未导出)、shell 选项(set -…
或shopt …
)、键绑定、别名和函数定义等。.zshrc
显然,如果您覆盖activate
脚本设置的环境变量,这将不起作用。.*shrc
这就是文件不应该设置环境变量的原因之一。使用
ZDOTDIR
~/venv_startup
例如,在包含两个文件 .zshenv 和 .zshrc的位置创建一个(可能是临时的)目录。.zshenv 文件包括而 .zshrc 说
现在,通过调用 zsh
这对 zsh 说,“不要一开始就在 .zshenv 和 .zshrc 文件中
$HOME
获取文件,而是在其中获取这些名称的文件/venv_startup
。” 由于/venv_startup
源代码中的版本$HOME
无论如何都是,最终结果是shell将运行在执行你的 zshenv 和你的 zshrc 之间。之后,这将是一个正常的交互会话。