【问题标题】:pyenv giving shopt command not found error on macospyenv 在 macos 上给出 shopt 命令未找到错误
【发布时间】:2023-12-20 05:52:02
【问题描述】:

一段时间以来,我一直在使用 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

编辑 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

【问题讨论】:

  • /usr/local/bin/pyenv 的第一行是什么?
  • which shopt 的输出是什么?
  • 运行env并将其输出添加到您的问题中
  • @MarkSetchell 第一行是 #!/usr/bin/env bash 但这个问题也发生在 bash 终端中。
  • @con-- shopt 是一个内部的bash 命令,在zshwhich shopt 的输出上当然找不到命令,在bash 终端上它什么也不返回,因为它不是一个命令,但如果我做简单的shopt,它会显示一些与shopt相关的东西。

标签: python macos zsh zshrc pyenv


【解决方案1】:

根据您的信息和 cmets,您的问题似乎有 3 个原因齐头并进:

  1. pyenv 是一个 bash(和 bash-only)脚本,带有一个 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. (如果您使用的是自制软件)
    检查您是否通过 homebrew 安装了bash(后来不知何故被 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

【讨论】:

  • 根据您从 cmets 的观察#2,我重新安排了我的 PATH,现在它可以正常工作了,谢谢。