macOSのコマンドがLinuxと異なる理由
macOSはBSD Unixをベースに構築されており、コマンドラインツールもBSDプロジェクト由来です。LinuxのGNUツールとは別物です。基本的な使い方は同じですが、オプションやフラグの細部に違いがあります。
代表的な違いを見てみましょう。
| コマンド | GNU(Linux) | BSD(macOS) |
|---|---|---|
| sedの直接編集 | sed -i 's/old/new/' file | sed -i '' 's/old/new/' file |
| lsのカラー表示 | ls --color=auto | ls -G |
| 日付の計算 | date -d '2 days ago' | date -v-2d |
| シンボリックリンクの解決 | readlink -f path | 非対応(grealpath が必要) |
Linuxベースのチュートリアルやコースでターミナルを学ぶ場合、Mac上にGNUツールを入れておけば同じように動作します。
Homebrewのインストール
HomebrewはmacOSの標準的なパッケージマネージャーです。すでにインストール済みの場合は、次のセクションに進んでください。
ターミナルを開く
アプリケーション > ユーティリティ から ターミナル.app を開くか、Spotlight(Cmd + Space)で「ターミナル」と検索します。
Homebrewインストーラを実行する
以下のコマンドを貼り付けてEnterを押します。
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"画面の指示に従ってください。macOSのパスワード入力を求められる場合があります。
インストールを確認する
brew --versionバージョン番号が表示されれば、Homebrewの準備は完了です。
Apple Silicon Mac(M1/M2/M3/M4)ではHomebrewは /opt/homebrew/ にインストールされます。Intel Macでは /usr/local/ になります。インストーラが正しいパスを案内します。
GNU Coreutilsのインストール
coreutilsパッケージをインストールする
brew install coreutilsls、cat、cp、mv、sort、date などのGNU版がインストールされます。既存のBSDツールとの競合を避けるため、デフォルトでは g プレフィックス付きの名前になります(例:ls の代わりに gls)。
GNUツールをPATHに追加する
GNU版を(g プレフィックスなしで)デフォルトとして使うには、gnubinディレクトリをPATHの先頭に追加します。
zsh(現在のmacOSのデフォルトシェル)の場合:
echo 'export PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"' >> ~/.zshrc
source ~/.zshrcbash の場合:
echo 'export PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile動作を確認する
ls --version出力に GNU coreutils と表示されていれば、GNU版がデフォルトになっています。「illegal option」というエラーが出る場合は、PATHの変更が反映されていないので、新しいターミナルウィンドウを開いてみてください。
その他のGNUツールのインストール
Coreutilsは基本をカバーしますが、他にもBSD/GNUの違いがあるツールがいくつかあります。以下もインストールしておくと便利です。
brew install gnu-sed # GNU sed('' なしで直接編集可能)
brew install grep # GNU grep(--color、-P でPerl正規表現対応)
brew install findutils # GNU find、xargs、locate
brew install gawk # GNU awk
brew install gnu-tar # GNU tar
これらも g プレフィックスなしで使うには、gnubinディレクトリをPATHに追加します。
# ~/.zshrc または ~/.bash_profile に追加
export PATH="$(brew --prefix gnu-sed)/libexec/gnubin:$PATH"
export PATH="$(brew --prefix grep)/libexec/gnubin:$PATH"
export PATH="$(brew --prefix findutils)/libexec/gnubin:$PATH"
export PATH="$(brew --prefix gawk)/libexec/gnubin:$PATH"
export PATH="$(brew --prefix gnu-tar)/libexec/gnubin:$PATH"
これらのPATH設定行はまとめてシェル設定ファイルに追加できます。編集後、source ~/.zshrc を実行する(または新しいターミナルを開く)と変更が反映されます。
解消される主な違い
GNUツールを導入すると、以下の一般的な問題が解消されます。
sedの直接編集
# GNUのsedなら、LinuxでもmacOSでも同じ書き方でOK
sed -i 's/foo/bar/' file.txt
macOSで -i の後に '' を付ける必要がなくなります。
日付の計算
# GNU date — LinuxでもmacOSでも同じ
date -d '2 days ago' +%Y-%m-%d
date -d 'next friday' +%Y-%m-%d
grepの拡張正規表現
# GNU grep は -P(Perl互換正規表現)に対応
grep -P '\d{3}-\d{4}' contacts.txt
BSDツールに戻すには
元のBSD版を使いたい場合は、フルパスで直接実行できます。
/usr/bin/sed # BSD sed
/usr/bin/grep # BSD grep
完全に元に戻すには、PATHからgnubinディレクトリを削除してください。
次のステップ
GNUツールの導入により、macOSのターミナルがLinuxと同じ挙動になりました。Linux向けに作られたチュートリアルやガイド、コースがそのまま動作します。WebTerm Learnのインタラクティブコースも同様です。