pyenv在macOS上出现“shopt命令未找到”的错误

3

我已经使用 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的内容都被注释掉了,但我仍然遇到了问题。
我的操作系统版本是: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

运行 env 命令并将其输出添加到您的问题中。

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

第三次编辑

在建议尝试之前,请先阅读此聊天记录,因为我可能已经尝试过了。聊天记录开始于Apr 29 02:01 UTC +5,然后转移到了一个线程中。

第四次编辑

设置了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

“which shopt”的输出是什么? - ConorSheehan1
@MarkSetchell 第一行是 #!/usr/bin/env bash,但这个问题也发生在 Bash 终端中。 - saadi
@TarunLalwani 完成。 - saadi
@saadi /usr/bin/env bash 是否真的执行 /usr/bin/bash?如果您将 pyenv 可执行文件中的 shebang 更改为 #!/usr/bin/bash,会发生什么?另外,请记住您可以通过设置 PYENV_DEBUG=1 来运行带有调试输出的 pyenv - amain
所以它没有正常工作,例如 pyenv --version 可以工作,但是 pyenv ls 不能工作,然后我运行了 $ which bash 并查看输出,我运行了 ls -l /usr/local/bin/bash 然后发现一个符号链接 /usr/local/bin/bash -> /bin/zsh ,这个链接应该在这里吗?而且,在上面的评论中进行的更改使一些命令可以正常工作,一些命令不行,这是什么行为? - saadi
显示剩余6条评论
1个回答

1
根据您的信息和评论,似乎您的问题有三个原因密切相关:
  1. pyenv是一个bash(仅限于bash)脚本,具有shebang行#!/usr/bin/env bash
  2. /usr/local/bin在您的PATH中比/usr/bin/bin更靠前,因此其中的可执行文件首先被/usr/bin/env(特别是在使用homebrew时)捕获
  3. /usr/local/bin/bash是符号链接到/bin/zsh!?!

因此,最终您正在使用zsh运行pyenv,尽管它是bash的近似替代品,但不知道shopt,因此会出错。我不知道为什么会链接符号链接,但不应该这样做,因为zsh不是完全兼容的替代bash

我建议

  1. (in case you are using homebrew)
    Check if you have/had bash installed through homebrew (which was later somehow replaced by a symlink to zsh):

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

    And uninstall bash if not required anymore (which should then remove /usr/local/bin/bash).

  2. Either delete or at least rename the culprit:

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

    Or, if some program requires /usr/local/bin/bash to be in place, just have it point to /bin/bash.


根据您在评论中提到的观察结果,我重新排列了我的PATH,现在它可以正常工作,谢谢。 - saadi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接