命令执行后如何保持zsh 运行?

How to keep zsh running after command execution?

我一直在使用这个 bash stanza 在我的 python 虚拟环境中启动一个新的 shell。

bash -i <<< 'source venv/bin/activate; exec < /dev/tty'

我天真地把它翻译成zsh:

zsh -i <<< 'source venv/bin/activate; exec < /dev/tty'

当调用此 zsh 节时,我的激活脚本似乎不是 运行。我如何实现相同的功能?

不过,正如我在评论中所表达的那样,您看到的行为可能是 zsh 中的错误(至少在我看来它与手册页中的信息相矛盾),我可以建议以下解决方法:

您打开的每个交互式 shell 都会获取您的 ~/.zshrc,并且有时您希望拥有一个交互式 zsh,它还可以获取您的 Python 环境设置。因此,我会在您的 .zshrc 中添加以下几行:

[[ ${set_py:-no} == yes ]] && source ~/venv/bin/activate
unset set_py
function pyzsh
{
  set_py=yes zsh "$@"
}

从您的交互式 shell,然后您可以执行 pyzsh 来创建具有 Python 设置的交互式 zsh,并且仅仅 zsh 来创建交互式zsh 没有。 -i 是不必要的,因为 shell 作为交互式 shell 的子项以这种方式启动,也将是交互式的。

此信息来自 freenode 上关于#zsh 的对话。 (该频道似乎没有被记录)。问题似乎在于 zsh 行编辑器 zle 使用 /dev/fd/10 而不是标准输入。这被视为 zsh 手册中未记录的实现细节。

最直接的 zsh 翻译可能是

zsh -i --nozle <<< 'source venv/bin/activate; exec < /dev/tty; setopt zle'

另一种激活虚拟环境的方法可能是

zsh -c 'source venv/bin/activate && exec zsh -i'

另一个需要考虑的因素是 python -m venv 编写的激活脚本强调 venv/bin/activate 应该是 运行 来自 bash (venv/bin/activate.zsh 明显不存在) , 所以也许最安全的做法是

bash -c 'source venv/bin/activate && exec zsh -i'