Posts macOS 使用 GNU 命令
Post
Cancel

macOS 使用 GNU 命令

macOS 的自带命令行工具是 BSD 风格的,想在 Mac 上开发可以完美运行在 GNU/Linux 上的 Bash 脚本,必须依赖 Linux 服务器,或者本地 Linux VM / Docker 去测试脚本,甚是麻烦。如果替换 BSD 命令为 GNU 命令,把 Mac 当做 Linux 机器来用(不包括内核部分),将会意义非凡。

安装 GNU 工具

所需的 GNU 工具可通过Homebrew安装,常用工具的安装如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ brew install coreutils
$ brew install findutils
$ brew install gnu-sed
$ brew install gnu-indent
$ brew install gnu-tar
$ brew install gnu-which
$ brew install gnutls
$ brew install grep
$ brew install gzip
$ brew install screen
$ brew install watch
$ brew install wdiff --with-gettext
$ brew install wget
$ brew install less
$ brew install unzip

如需要搜索所有 GNU 工具列表,可以通过以下命令获得:

1
$ brew search gnu

覆盖系统自带命令

Homebrew安装的命令工具默认放置在/usr/local/opt/,而系统自带 BSD 工具的路径为/usr/bin/。当安装的 GNU 命令与系统自带命令重复时,用前缀g可以指定使用 GNU 版本,如:

1
2
3
$ gsed # GNU 版本(gnu-sed)

$ sed  # BSD 版

如果想省去g前缀,在环境变量PATH中把 GNU 工具的执行路径放置于/usr/bin之前即可,原理就是在系统扫描可执行路径时,会使用第一个符合条件的值(其实在安装命令工具的时候,输出日志就有指示):

1
$ export PATH="/usr/local/opt/<PACKAGE>/libexec/gnubin:$PATH"

上述<PACKAGE>为工具包名称。对应前文“安装 GNU 命令工具”里提及的工具,在文件~/.bash_profile添加如下环境变量以实现对系统默认工具的覆盖:

1
2
3
4
5
6
7
8
9
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
export PATH="/usr/local/opt/binutils/bin:$PATH"
export PATH="/usr/local/opt/ed/libexec/gnubin:$PATH"
export PATH="/usr/local/opt/findutils/libexec/gnubin:$PATH"
export PATH="/usr/local/opt/gnu-indent/libexec/gnubin:$PATH"
export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
export PATH="/usr/local/opt/gnu-which/libexec/gnubin:$PATH"
export PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

刷新使其生效:

1
$ source ~/.bash_profile

在 BSD 与 GNU 之间切换

如果你因临时业务需求(或者纯粹觉得花大价钱买来的 Mac 不用太浪费)想换回 BSD 环境时,那么可以暂时屏蔽相关的 GNU 的执行路径:

1
# export PATH="/usr/local/opt/<PACKAGE>/libexec/gnubin:$PATH"

聪明的你也许发现了,要手动屏蔽的内容多达 9 行,而且之后恢复 GNU 还得一条条去掉注释符号#,是时候要想个办法偷懒了。可考虑修改~/.bash_profile,加一个if判断进行切换:

1
2
3
4
5
6
_gnu=false # set 'true' to enable GNU, otherwise use BSD

if [[ $_gun = true ]]; then
    export PATH="/usr/local/opt/<PACKAGE>/libexec/gnubin:$PATH"
    ...
fi

以后要用 GNU,就把_gnu的值改为true,否则改为false即可,每次修改记得来一发source刷新,或者重启 Terminal。

现在,Mac 可以当作是换皮 Linux 来写脚本了,性价比再加一分。

参考资料

This post is licensed under CC BY 4.0 by the author.

TXT 制作 MOBI

Homebrew 替换国内源

Comments powered by Disqus.