macOS安装GNU命令行工具

2017-09-01|Categories: macOS|

Why

macOS和Linux都是从Unix发展出来的,但同源而异流,虽然许多基础工具名称相同,但实现方式不同,导致不同系统上相同名称的工具支持的选项不同,例如ls命令启用彩色输出的选项就是如此:

# macOS
ls -G

# Linux
ls --color=auto

这种不兼容的情况很多,这篇文章详细对比了grepsedfind三个命令在macOS和Linux系统的差异,轻则带来使用上的困惑,重则损坏数据和系统。因此,对于同时使用两种系统的用户,使用相同的基础工具非常有必要。

那应该以哪个系统的基础工具为准呢?答案是Linux。原因如下:

  1. Linux版本的工具通常功能更强大。
  2. Linux版本的工具通常更新速度更快,有更高的安全性。
  3. Linux版本的工具安装到macOS有简单、成熟的方案。
  4. 安装macOS的通常是个人电脑,很容易决定是否安装Linux工具,万一出了问题影响也不大;而安装Linux的通常是服务器,服务器最重要的是稳定性、安全性,出了问题影响太大,不可能允许随意更换系统基础工具。
  5. Linux在服务器领域的影响远超macOS,学习Linux工具的回报更高。

What

Linux系统的基础工具都来自GNU计划

How

安装Homebrew

Homebrew的安装非常简单,但安装脚本会持续更新,所以需要到官方网站获取安装脚本。

安装GNU Coreutils

brew install coreutils

安装其它GNU工具

首先执行一次brew tap homebrew/dupes,因为以下的某些工具存放在这个仓库。

因为安装的项目比较多,可以在命令行使用ctrl-x ctrl-e调用$EDITOR定义的文本编辑器编辑好所有的命令,然后批量执行,省去大量的重复输入。

我设置了export EDITOR=vim,所以ctrl-x ctrl-e会打开Vim,把以下命令粘贴到Vim:

brew install binutils
brew install diffutils
brew install ed --with-default-names
brew install findutils --with-default-names
brew install gawk
brew install gnu-indent --with-default-names
brew install gnu-sed --with-default-names
brew install gnu-tar --with-default-names
brew install gnu-which --with-default-names
brew install gnutls
brew install grep --with-default-names
brew install gzip
brew install screen
brew install watch
brew install wdiff --with-gettext
brew install wget

输入:wq退出Vim,Homebrew会逐个安装指定的工具,启用了--with-default-names的工具需要从源码编译安装,耗时比较长。

如果不启用--with-default-names,安装的工具会被添加g前缀,使用的时候就是gsedgfindgtar,查看帮助文件就是man gsed

更新macOS自带的GNU工具

brew install bash

# `--with-pcre` for supporting `\b` meta-character.
# without it, we must use `[[:<:]]` and `[[:>:]]` 
# to match beginning and end of word respectively on macOS
# https://stackoverflow.com/a/22742371/3025050
brew install less --with-pcre

brew install gdb  # gdb requires further actions to make it work. See `brew info gdb`.
brew install gpatch
brew install m4
brew install make

具体安装哪些工具可以根据实际需要选择。

更新macOS自带的其它工具

这些工具不是来自GNU计划,但macOS出厂自带的版本太老旧,很有必要更新:

brew install file-formula
brew install git
brew install openssh
brew install python
brew install rsync
brew install unzip

安装后调整环境变量

所有需要调整的内容都来自brew info formula_nameCaveats部分,例如brew info coreutils

# ===== ===== ===== ===== ====== ===== ==== ===== 
# GnuUtils for macOS
# ===== ===== ===== ===== ====== ===== ==== ===== 

# coreutils
export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
# m4
export PATH="/usr/local/opt/m4/bin:$PATH"
# make
export PATH="/usr/local/opt/make/libexec/gnubin:$PATH"
export MANPATH="/usr/local/opt/make/libexec/gnuman:$MANPATH"
# which
alias which='alias | /usr/local/bin/which --tty-only --read-alias --show-dot --show-tilde'

# ===== ===== ===== ===== ====== ===== ==== ===== 
# Non-GNU utilities shipped by macOS have been updated
# ===== ===== ===== ===== ====== ===== ==== ===== 

# file-formula
export PATH="/usr/local/opt/file-formula/bin:$PATH"
# git (completion for bash)
if [ -f $(brew --prefix)/etc/bash_completion.d/git-completion.bash ]; then
      . $(brew --prefix)/etc/bash_completion.d/git-completion.bash
fi
# unzip
export PATH="/usr/local/opt/unzip/bin:$PATH"

使用macOS原版工具

需要使用macOS原版工具时,输入完整路径即可,完整路径可通过which -a查询。

需要查询macOS原版工具手册时,首先通过man -aW查询手册路径,再通过man -M查询特定路径的手册:

$ man -aW sed
/usr/local/share/man/man1/sed.1
/usr/share/man/man1/sed.1

$ man -M /usr/share/man/ sed

参考文章

Leave A Comment