当目录仍在 $PATH 中时无法安装

当目录仍在 $PATH 中时无法安装

在安装 OH MY POSH 时,出现这两个错误,尽管第二个错误是一个错误(已报告)。我已在 ~/.zshrc 中添加了/usr/local/bin $PATH 中的目录,并在回显时显示。我不明白为什么它告诉我安装目录不在 $PATH 中。

在此处输入图片描述

答案1

您收到此错误是因为您正在使用 运行 bash 脚本zsh。安装时请始终遵循说明。您正在使用 以 root 身份运行此脚本sudo,这是一个糟糕的想法(您真的不想盲目地将下载的 shell 脚本导入 root shell),而不是 安装说明建议。

然后,你用 运行了一个 bash 脚本zsh。这就是导致错误的原因。你可以用这个小代码片段重现它,它只是install.sh脚本中相关代码的一个稍微简化的版本:

p="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
install_dir="/usr/local/bin"
  good=$(
        IFS=":"
        for path in $p; do
        if [ "${path%/}" = "${install_dir}" ]; then
            printf 1
            break
        fi
        done
    )

    if [ "${good}" != "1" ]; then
        echo "Installation directory ${install_dir} is not in your \$PATH"
    else
      echo "Dir $install_dir FOUND!"
    fi

如果使用 bash 运行它,它会按预期工作并打印已找到目录:

$ bash ~/scripts/foo.sh
Dir /usr/local/bin FOUND!

但是,运行它zsh会返回您看到的错误:

$ zsh ~/scripts/foo.sh
Installation directory /usr/local/bin is not in your $PATH

这是因为在 zsh 中,除非通过 或 明确请求 SH_WORD_SPLIT 选项,否则不会在 IFS 上拆分未引用的字符串。因此$p,上的字符串比较只执行一次,而 上的整个 则在 LHS 1上执行。setopt shwordsplit$=p${=p}for path in $p; .../usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

因此,使用编写脚本的 shell 运行该脚本,它应该可以按预期工作。如果您 100% 确信它是安全的,您可以使用sudo它安装在默认/usr/local/bin目录中:

curl -s https://ohmyposh.dev/install.sh | bash -s

或者,为了更安全一点,只需为你的用户安装

curl -s https://ohmyposh.dev/install.sh | bash -s -- -d ~/bin

1.path在 zsh 中用作用户变量也是不行的 - 就像在 csh 中一样,它path是一个数组版本,PATH分配给它会破坏后续的命令查找 - 尽管在这种情况下效果只是$(...)命令替换的本地效果。

相关内容