在您的系统上检测到过时版本的 bash!更新sdkman时

在您的系统上检测到过时版本的 bash!更新sdkman时

我正在尝试更新 macOS 中的软件sdman,但出现 bash outadted 版本错误。

rajkumar.natarajan$ sdk update   
    An outdated version of bash was detected on your system!
    We recommend upgrading to bash 4.x, you have:

    3.2.57(1)-release
    Need to use brute force to replace candidates...

但bash版本已经是最新的了。

rajkumar.natarajan$ which bash 
/usr/local/bin/bash   
rajkumar.natarajan$ bash --version   
GNU bash, version 5.0.11(1)-release (x86_64-apple-darwin16.7.0)
Copyright (C) 2019 Free Software Foundation, Inc.   
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.   
There is NO WARRANTY, to the extent permitted by law.

答案1

sdman正在查看/bin/bash哪个版本是 3.2.57,因为 macos 无法附带任何比它更新的版本。

Apple 在其操作系统中包含如此旧版本的 Bash 的原因与许可有关。从版本 4.0(3.2 的后继者)开始,Bash 使用 GNU 通用公共许可证 v3 (GPLv3),Apple 不(不想)支持它。您可以在这里和这里找到一些关于此问题的讨论。 GNU Bash 3.2 版本是最后一个采用 GPLv2 的版本,Apple 接受了该版本,因此它坚持使用它。

来源

您已经安装了现代版本的 bash,但尚未替换/bin/bash它。我真的不建议这样做,因为它可能会破坏一些遗留脚本/程序(不太可能但有可能)。

我的建议是忽略该警告。它警告您,因为 bash v3.2 通常会受到以下问题的影响炮弹休克症漏洞,但是 Apple 已在其 Bash v3.2 版本中修复了此漏洞。

如果您无法忽略该警告并且确实想冒险更新您的文件,/bin/bash我会将其移动到备份位置并将您的新 bash 符号链接到它。

sudo mv /bin/bash /bin/bash.bak
sudo ln -s /usr/local/bin/bash /bin/bash

但为了做到这一点,你需要绕过SIP

要启用或禁用系统完整性保护,您必须引导至恢复操作系统并从终端运行 csrutil(1) 命令。

  • 通过重新启动计算机并在启动时按住 Command 和 R 键引导至恢复操作系统。
  • 从实用程序菜单启动终端。
  • 输入以下命令:
    $ csrutil disable
  • 在计算机上启用或禁用系统完整性保护后,需要重新启动。

答案2

您可以通过以下方式强制更新到最新版本:

$ sdk selfupdate force

相关内容