pyenv 在 macOS 上给出 shopt 命令未找到错误

pyenv giving shopt command not found error on macos

一段时间以来,我一直在使用 pyenv 来管理 mac 上的 python 版本和虚拟环境。 最近我重新安装了 pyenv,从那时起,在我尝试 运行 的每个 pyenv 命令中,我都收到以下错误

/usr/local/bin/pyenv:94: command not found: shopt

我的默认 shell 是最新的 MacOS 的默认 shell 即 zsh.
在搜索修复程序时,我发现它与 bash 干扰 zsh 有关。
我设置里默认的shell是zsh~/.bash_profile/etc/profile/etc/bashrc的内容都被注释掉了,但还是有问题
我的 OS 版本是:10.15.4.
我也尝试重新安装 pyenv,但我遇到了同样的错误。

我无法 运行 任何 pyenv 相关命令。

编辑 1

根据文档,我的 .zshrc 中已经有了这些行,但是如您所见,即使这个 运行 一个命令 pyenv root 也给了我相同的 shopt错误。

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$(pyenv root)/shims:$(pyenv root)/completions/pyenv.zsh:$PATH"

编辑 2

Run env and add the output in your question

TMPDIR=/var/folders/gm/t0h6v8jx4bqd6cj73_k27myw0000gp/T/
XPC_FLAGS=0x0
TERM_PROGRAM_VERSION=433
TERM_PROGRAM=Apple_Terminal
XPC_SERVICE_NAME=0
TERM_SESSION_ID=55A65E3A-9B71-4C8A-81B8-0170EEAE3DCE
TERM=xterm-256color
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.j6zkqCw6Of/Listeners
SHELL=/bin/zsh
HOME=/Users/abc
LOGNAME=abc
USER=abc
PATH=/usr/local/opt/openssl@1.1/bin:/Users/saadali/Library/Python/3.7/bin:/usr/local/Cellar/postgresql@9.6/9.6.16/bin/:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/abc/bin:/usr/local/opt/rabbitmq/sbin
SHLVL=1
PYTHONPATH=
LANGUAGE=en_US.UTF-8
port=
LC_NUMERIC=en_US.UTF-8
LC_TIME=en_US.UTF-8
LC_COLLATE=en_US.UTF-8
LC_MONETARY=en_US.UTF-8
LC_PAPER=en_US.UTF-8
LC_NAME=en_US.UTF-8
LC_ADDRESS=en_US.UTF-8
LC_TELEPHONE=en_US.UTF-8
LC_MEASUREMENT=en_US.UTF-8
LC_IDENTIFICATION=en_US.UTF-8
CPPFLAGS=-I/usr/local/opt/openssl@1.1/include
LDFLAGS=-L/usr/local/opt/openssl@1.1/lib
CFLAGS=-I/usr/local/opt/openssl@1.1/include
LANG=en_US.UTF-8
LC_MESSAGES=en_US.UTF-8
LC_ALL=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
_=/usr/bin/env

编辑 3

在推荐尝试之前,请先阅读 this 聊天,因为我可能已经尝试过了。聊天从 Apr 29 02:01 UTC +5 开始,然后转到一个话题。

编辑 4

设置PYENV_DEBUG=1后,这里输出

(vmds) saadali@A006-00276 ~ :~$ pyenv
+ [:22] enable -f /../libexec/pyenv-realpath.dylib realpath
+ [:29] [ -z '' ']'
+ [:31] READLINK=+ [:31] type -p greadlink readlink
+ [:31] READLINK=+ [:31] head -1
+ [:31] READLINK='greadlink not found' 
+ [:32] [ -n 'greadlink not found' ']'
+ [:57] [ -z '' ']'
+ [:58] PYENV_ROOT=/Users/abc/.pyenv 
+ [:62] export PYENV_ROOT
+ [:65] [ -z '' ']'
+ [:66] [ -n '' ']'
+ [:82] [ -z '' ']'
+ [:83] PYENV_DIR=/Users/abc 
+ [:86] [ ! -d /Users/abc ']'
+ [:86] [ ! -e /Users/abc ']'
+ [:90] PYENV_DIR=+ [:90] cd /Users/abc
+ [:90] echo /Users/abc
+ [:90] PYENV_DIR=/Users/abc 
+ [:91] export PYENV_DIR
+ [:94] shopt -s nullglob
/usr/local/bin/pyenv:94: command not found: shopt

根据您的信息和评论,您的问题似乎有 3 个共同的原因:

  1. pyenv 是一个 bash(和 bash -only) 带有 shebang 行的脚本 #!/usr/bin/env bash
  2. /usr/local/bin 在您的 PATH 中出现在 /usr/bin/bin 之前,因此其中的可执行文件首先由 /usr/bin/env 获取(期望的行为,尤其是在使用 自制软件)
  3. /usr/local/bin/bash 符号链接到 /bin/zsh!?!

所以最后你是 运行 pyenvzsh,虽然是 bash,不了解 shopt,因此窒息。我不知道为什么符号链接到位,但它不应该,因为 zsh 不是 bash 的完全兼容的替代品。

我建议

  1. (如果您使用的是自制软件)
    检查你 have/had bash 是否通过 homebrew 安装(后来以某种方式被指向 zsh 的符号链接所取代):

    # shows only top-level packages (directly installed)
    brew leaves        
    
    # shows *all* packages with dependency tree
    brew deps --tree --installed
    

    如果不再需要,请卸载 bash应该 然后删除 /usr/local/bin/bash)。

  2. 删除或至少重命名罪魁祸首:

    mv /usr/local/bin/bash /usr/local/bin/bash_link_to_zsh

    或者,如果某些程序要求 /usr/local/bin/bash 到位,只需将其指向 /bin/bash