Mac下shell命令支持map

Mac下shell命令支持map

January 19, 2020

Mac自带的bash是3.x版本的,shell中的declare命令不支持-A这个参数,会报下面的错误:

declare: -A: invalid option
declare: usage: declare [-afFirtx] [-p] [name[=value] ...]

这个参数从bash 4.x开始支持,需要升级至4.x以上的版本

# 安装最新版本的bash
brew install bash

# 新版本的bash安装路径是 /usr/share/bin/bash, 而之前系统自带的是 /bin/bash
# 需要把新版本的shell添加至信任列表中
sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'

# 如果需要的话,修改默认shell为新版本的bash
chsh -s /usr/local/bin/bash

需要注意的是,升级完之后,如果shell脚本需要用新版本的bash来执行,必须在相关的shell脚本开头的部分,将 #!/bin/bash 替换成 #!/usr/local/bin/bash, 否则还是用旧版本的bash来执行。

那为什么不执行类似下面的命令,删除原先的bash,并给新版本的bash建立一个链接呢?这个是由于MacOS有系统完整性保护机制(System Integrity Protection,SIP),它会阻止所有用户(包括root)修改 /bin 下面目录的内容。当然,也有办法绕过这保护机制,嫌麻烦的话,就不要去动它了。

sudo rm /bin/bash
sudo ln -s /usr/local/bin/bash /bin/bash

参考文章:

最后更新于