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

如何在命令执行后保持zsh运行?,zsh,Zsh,我一直在用它来启动python虚拟环境的新shell bash -i <<< 'source venv/bin/activate; exec < /dev/tty' bash-i不过,正如我在评论中所说,您看到的行为可能是zsh中的一个bug(至少在我看来,它与手册页中的信息相矛盾),我可以建议以下解决方法: 您打开的每个交互式shell都源于~/.zshrc,有时您希望有一个交互式zsh,它还源于Python环境设置。因此,我将在您的.zshrc中添加以下行: [[

我一直在用它来启动python虚拟环境的新shell

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

bash-i不过,正如我在评论中所说,您看到的行为可能是zsh中的一个bug(至少在我看来,它与手册页中的信息相矛盾),我可以建议以下解决方法:

您打开的每个交互式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
来创建一个没有Python设置的交互式zsh。
-i
是不必要的,因为以这种方式启动的shell作为交互式shell的子shell也将是交互式的。

此信息来自freenode上的#zsh上的对话。(该频道似乎未被记录)。复杂之处似乎在于zsh行编辑器zle使用
/dev/fd/10
而不是stdin。这被视为zsh手册中未记录的实施细节

对zsh最直接的翻译可能是

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

另一个要考虑的因素是:<代码> Python -M VVEV 所写的激活脚本强调:<代码> VEV/BI/Actudio应该从BASH运行(<代码> VEV/BI/Actudio。ZSH 不存在),所以最安全的事情是

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

zsh-我猜:由于
-i
使zsh成为一个交互式shell,它尝试从附加的tty或pty读取命令,而不是从stdin读取命令。告诉它从其他地方获取输入是行不通的。出于同样的原因,
zsh-i scriptname
不起作用(至少在我的平台上是Cygwin)。这与手册页中明确指出的带有
-i
:仍然可以指定要执行的脚本相矛盾。也许是zsh中的一个bug?我从freenode上对#zsh的评论中收集到了这一点
zsh -c 'source venv/bin/activate && exec zsh -i'
bash -c 'source venv/bin/activate && exec zsh -i'