在 macOS 上更新 bash 且安装 bash-completion

macOS 的终端环境不如 Ubuntu 便利,终端下没啥颜色也就算了,
却发现 macOS 预置的 bash 太老居然不支持 Associative Array,还不支持补全

本文就是来解决这个问题的。


验明正身

先检查一下你现在的 bash 是什么版本的。

echo ${BASH_VERSION}

如果你的 bash 输出的版本号比我输出的 “3.2.57(1)-release” 更新的话,请自行评估有没有必要更新。

我是在 High Sierra 上测试的,macOS 贴心的给我预装了一个 14 年 11 月的远古 bash 3.2.57。
网上搜了搜说是这是 bash 最后一个基于 GPL2 的版本,也许就是授权问题吧。

更新 bash

先确保你有 Homebrew,没有的话自己去装一个

然后,安装 bash 4.x:

brew install bash

然后需要把新的 bash 添加到 /etc/shells 才能供用户 login。

sudo bash -c 'echo /usr/local/bin/bash >> /etc/shells'

接下来把当前用户的默认 shell 改成刚装的新 bash。

chsh -s /usr/local/bin/bash 

然后关闭当前终端,重启 shell 即可。

安装 bash-completion

Ubuntu 预装了 bash-completion 这一强大的工具,使得各种工具都能补全其命令,十分体面。

weiyulans-iMac:completions weiyuan$ tar z<TAB>
zc  zt  zx
weiyulans-iMac:completions weiyuan$ tar zx<TAB>
zxb  zxf  zxm  zxv  zxw
weiyulans-iMac:completions weiyuan$ tar zxv<TAB>
zxvb  zxvf  zxvm  zxvw
weiyulans-iMac:completions weiyuan$ tar zxvf<TAB>
zxvfb  zxvfm  zxvfw
weiyulans-iMac:completions weiyuan$ tar zxvf

你看上面是不是十分体面方便。

多亏了 Homebrew,安装也十分便利。

brew install bash-completion@2

加了个 "@2" 的缘故,是因为指定安装版本 2.x 的 bash-completion,应该能比默认的 1.3 的版本有 更多功能。

Homebrew 应该会提示你,要你在 ~/.bash_profile 文件里面加点东西,注意看一下。

添加缺失的 bash-completion

不知道为毛,git 这么核心的软件的补全居然不在 bash-completion 默认的代码库里面。

请注意,通过 xcode command line tools 安装的 git 版本比较猎奇,无法使用 git 的 bash 补全功能。建议使用 brew install git 安装个正常的 git。

只好去找找 git 自己有没有提供 completion 文件,得益于现代科技搜索引擎,很快便找到了:git-completion.bash

执行:

wget https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -P /usr/local/etc/bash_completion.d/

然后重启 bash 即可。

参考

  1. 为 Mac OS 添加 Bash Completion
  2. Upgrade to bash 4 in Mac OS X
  3. How To Enable Git Tab Completion In Bash On Mac OS X

social