Homebrew で macOS に GNU コマンドをインストールする


macOS のターミナルで使えるコマンドは主に BSD バージョンのものですが, Linux と同じ GNU バージョンのコマンドを Homebrew を使ってインストールする方法を紹介します.

Homebrew をインストール

なのでまず Homebrew がインストールされている必要があります.

まだインストールされていない方は次のコマンドでインストールできます:

# Command Line Tools for Xcode をインストールしていない場合
xcode-select --install

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

より詳しい情報は https://brew.sh/ から見れます.

GNU コマンドをインストール

Homebrew が使えるようになったら GNU コマンドをインストールすることができます.

僕がインストールした主な GNU コマンドを, 実際にどのようにインストールしたのかということを紹介させていただきたいと思います.

なので, 一般的なインストール方法というよりも, 僕個人のインストール方法という風に見ていただけると幸いです.

binutils

バイナリツール一式です.

主なコマンドとして, リンカの ld, アセンブラの as が使えるようになります.

他にも addr2line, ar, c++filt, dlltool, gold, gprof, nlmconv, nm, objcopy, objdump, ranlib, readelf, size, strings, strip, windmc, windres といったコマンドが使えるようになります.

次のコマンドでインストールしました:

brew install binutils

coreutils

GNU オペレーティングシステムの基本的な, ファイル, シェル, テキストを操作するユーティリティです.

例えば, chown, chmod, cp, ln, ls, mkdir, mv, rm, rmdir などの基本的な GNU コマンドが使えるようになります.

使えるようになる全てのコマンドは, List of GNU Core Utilities commands で見ることができます.

次のコマンドでインストールしました:

brew install coreutils

ただデフォルトでは, それらのコマンドを使用する際, 接頭辞として g を付けなければいけないので, 実際にそれらのコマンドを使う場合, gchown, gchmod, gcp, gln, gls, gmkdir, gmv, grm, grmdir といったようにする必要があります.

僕は接頭辞 g を付けないで使いたいので, brew info coreutils でも表示されるように, Zsh を使っているので .zshrc に次の PATH を加えています:

PATH="PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH""

加えて mancoreutils のコマンドを参照する時にも g 無しで参照したいので, 次の MANPATH を加えています:

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

これらの PATHMANPATH といったシェル変数を定義したら, source ~/.zshrc.zshrc の内容を読み込まなければ, 変更が反映されません.

このように coreutilsbinutils と同じように GNU コマンドをインストールするフォーミュラですが, binutils のようにただインストールするだけで, 接頭辞 g が付いていないコマンドを使えるようになるわけではありません.

なのでフォーミュラ毎に接頭辞 g をつけなくてもいいようにインストールする仕方は多少違ってきますので, それぞれのフォーミュラのインストール方法に従う方法があります.

diffutils

ファイル同士の違いを見つけることに関連したいくつかのプログラムのパッケージです.

cmp, diff, diff3, sdiff といったコマンドが使えるようになります.

次のコマンドでインストールしました:

brew install diffutils

findutils

GNU オペレーティングシステムの基本的なディレクトリ検索ユーティリティです.

find, locate, updatedb, xargs といったコマンドが使えるようになります.

インストールする際に --with-default-names をつけると, 接頭辞 g 無しのコマンドが使えるようになりますが, 僕はそのオプションを付けないで普通にインストールしました:

brew install findutils

coreutils の時と同じように, .zshrc に次の 2 行を追加して, コマンドを実行する時と man でコマンドを参照する時に接頭辞 g を付けなくてもいいようにしています:

PATH="/usr/local/opt/findutils/libexec/gnubin:$PATH"
MANPATH="/usr/local/opt/findutils/libexec/gnuman:$MANPATH"

インストールする際に --with-default-names を付けるか付けないかというのは, 個人の好みの問題だと思いますので, あくまで参考にしていただけたら幸いです.

どうして僕はそのオプションを付けないでインストールしているのかといいますのは, もし macOS 標準の BSD 版の find, locate, updatedb, xargs コマンドを実験的に実行してみたいという時に, その PATH の行をアンコメントして .zshrc を読み込み直すだけでそうすることができますが, --with-default-names を付けてインストールしてしまうと, 一旦 brew uninstall findutils で削除する必要があるからです. そして実験が終わったらまた brew install findutils --with-default-names でインスールし直す必要があります. そんな感じで BSD 版と GNU 版の切り替えがそのオプションをつけない方が幾らか楽だなと思いそのようにインストールしています.

ただ --with-default-names を付けてインストールしても, man で参照する時は MANPATH を設定する必要があります.

gawk

テキスト処理スクリプティング言語 awk の GNU 実装です.

gawk コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install gawk

gnu-sed

ストリームを編集する, インタラクティブでないコマンドラインテキストエディタです.

sed コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install gnu-sed

そして接頭辞 g をなくすために .zshrc に次の 2 行を追加しています:

PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
MANPATH="/usr/local/opt/gnu-sed/libexec/gnuman:$MANPATH"

gnu-tar

tar のアーカイブを作ることができます.

tar コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install gnu-tar

接頭辞 g をなくすため, 次の 2 行を .zshrc に追加しています:

PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
MANPATH="/usr/local/opt/gnu-tar/libexec/gnuman:$MANPATH"

gnutls

SSL, TLS, DTLS プロトコルとその周りのテクノロジを実装したセキュアなコミュニケーションライブラリです.

gnutls-certtool, gnutls-cli, gnutls-cli-debug, gnutls-serv, ocsptool, p11tool, psktool, srptool といったコマンドが使えるようになります.

次のコマンドでインストールしました:

brew install gnutls

grep

指定されたパターンにマッチする行を一つもしくは複数のファイルから検索します.

grep, egrep, fgrep コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install grep

接頭辞 g をなくすため, 次の 2 行を .zshrc に追加しました:

PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"
MANPATH="/usr/local/opt/grep/libexec/gnuman:$MANPATH"

grepgnu-grep とならないんですね.

gzip

広く使われているデータ圧縮プログラムです.

gzip コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install gzip

screen

いくつかのプロセス (大抵の場合, インタラクティブシェル) に一つの物理ターミナルを分割するフルスクリーンウィンドウマネージャです.

screen コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install screen

個人的には tmux しか使っていないのですが, GNU 版の terminal multiplexer としてコレクション的な感覚でインストールしています.

wdiff

1 ワード, 1 ワードに基づいてファイルを比較する diff のフロントエンドです.

mdiff, unify, wdiff, wdiff2 といったコマンドが使えるようになります.

次のコマンドでインストールしました:

brew install wdiff

wget

広く使われているインターネットプロトコル HTTP, HTTPS, FTP, FTPS を使って, ファイルを取り出すフリーソフトウェアパッケージです.

wget コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install wget

ed

行志向のテキストエディタです.

Unix のオリジナルのエディタで, そのことからスタンダードなテキストエディタと言われています.

ed, red というコマンドが使えるようになります.

次のコマンドでインストールしました:

brew install --with-default-names ed

gnu-indent

C のコードを見易くするプログラムです.

indent コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install --with-default-names gnu-indent

gnu-which

シェルプロンプトに入力された時に, どの実行ファイルが実行されるかを見つけるユーティリティです.

which コマンドが使えるようになります.

次のコマンドでインストールしました:

brew install --with-default-names gnu-which

gpg

RFC4880 によって定義されている OpenPGP 規格の完全でフリーな実装です.

データを暗号化して署名することができます.

gpg というコマンドが使えるようになります.

次のコマンドでインストールしました:

brew install --with-readline gpg

--with-readline オプションで, readline のサポート付きでビルドして ^H, ^F, ^B, <M-f>, <M-b> といったキーシーケンスでカーソル操作ができるようになります.

インストール方法のまとめ

今までに紹介してきた GNU コマンドのインストール方法をまとめると次のようになります:

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

接頭辞 g をなくすために .zshrc に追加した PATH, MANPATH は次のようになります:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
PATH="/usr/local/opt/findutils/libexec/gnubin:$PATH"
PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
PATH="/usr/local/opt/grep/libexec/gnubin:$PATH"

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
MANPATH="/usr/local/opt/findutils/libexec/gnuman:$MANPATH"
MANPATH="/usr/local/opt/gnu-sed/libexec/gnuman:$MANPATH"
MANPATH="/usr/local/opt/gnu-tar/libexec/gnuman:$MANPATH"
MANPATH="/usr/local/opt/grep/libexec/gnuman:$MANPATH"

このように Homebrew で GNU コマンドを接頭辞 g をつけないで使えるようにインストールする場合, それぞれのフォーミュラ毎に多少インストールの仕方が異なりますので, brew info <formula> で情報を確認してから, それぞれのフォーミュラに合わせてインストールしなくてはなりません.

僕は --with-default-names オプションを指定できるフォーミュラでも, PATH, MANPATH が設定できる場合 (brew info <formula> で確認できる場合), そのオプションは使わないで, BSD と GNU の切り替えが容易いという理由からそれらのシェル変数を定義して使うようにしています.

まとめ

僕は Homebrew で GNU コマンドをインストールして, macOS の既存の BSD コマンドを入れ替えてしまっているという内容でした.

個人的にはとても気に入っている設定なので, ご興味のある方は参考にされてください.

僕は Linux の経験はゼロなのですが, Linux から macOS に移られた方で, Linux の GNU コマンドを macOS でも使いたいけどどうすればいいのだろうかという方は宜しかったら今回の内容を参考にされてください.

GNU コマンドの魅力は GNU の公式サイトに書かれているように次のようなことだと思います:

GNU is an operating system which is 100% free software. It was launched in 1983 by Richard Stallman (rms) and has been developed by many people working together for the sake of freedom of all software users to control their computing. Technically, GNU is generally like Unix. But unlike Unix, GNU gives its users freedom.

“GNU は 100% フリーソフトウェアである OS です. GNU は 1983 年, Richard Stallman によって立ち上げられ, 全てのソフトウェアユーザが計算をコントロールする自由の為に, 多くの人々が一緒になって開発されてきたものです. 技術的には GNU は一般的に Unix のようなものです. ただ Unix と違って GNU はユーザに自由を与えます.”

ここでいう自由というのは, オープンソースであったり, ライセンス, 著作権ということだと思います.

みんなが本当の意味で自由に使えるって素晴らしすぎます.

だから僕は GNU コマンドをインストールしてみたくなってしまって, 実際にインストールして GNU コマンドを使っているという感じです.

GNU を立ち上げてくれた Richard Stallman さん, GNU コマンドを開発してくださったたくさんの方々, Homebrew を通じて macOS にポートしてくださった有志の方々, 本当に色んな方々のお世話になって使えるのかと思うと, GNU コマンドありがた過ぎます.

いやもう本当に.

こんな世界ですが, このような世界もあるんですね.

なんだか Richard Stallman さんが自由の女神ならぬ, 自由の神のような気さえしてきました.

Richard stallman

(この画像は Richard Stallman さんが St. IGNUcius に扮している様子です)

ただ Richard Stallman さん的には macOS で GNU コマンドを使うなんて邪教だとご叱責を賜ってしまうかもしれませんが…