我正在尝试更新 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