macOSでGNU coreutilsを導入してLinuxと同じコマンド環境を作る
HomebrewでGNU coreutilsをインストールし、macOSでLinuxと同じコマンドオプション・挙動を実現する方法を解説。sed -iやdate、readlinkなどBSD系とGNU系の違いに悩むすべての人へ。
🎯 この記事で学べること
- 1BSD系コマンドとGNU系コマンドの違いを具体例で理解できます
- 2HomebrewでGNU coreutilsを導入する手順がわかります
- 3PATHを設定してGNUコマンドをデフォルトにする方法を学べます
- 4coreutils以外のGNUツール(gnu-sed, findutils等)も導入できるようになります
- 5導入時の注意点やトラブルシューティングを把握できます
読了時間: 約5分
「Linuxでは動くのに、Macだとエラーになる…」問題
macOSのターミナルでLinuxのチュートリアル通りにコマンドを実行したら、なぜかエラーになった——そんな経験はありませんか?
# Linuxでは動くのに…
sed -i 's/old/new/g' file.txt
# macOS → エラー: sed: 1: "file.txt": invalid command code f
この原因は、macOSに入っているコマンドがBSD版で、LinuxのGNU版とはオプションや挙動が微妙に異なることにあります。
この記事では、HomebrewでGNU coreutilsを導入して、macOSでもLinuxと同じコマンド環境を構築する方法を解説します。
BSD系とGNU系って何が違うの?
macOSはBSD Unix系のOS、LinuxはGNUプロジェクトのツール群を使うOSです。同じ名前のコマンドでも「中身が違う」ケースがたくさんあります。
よくハマる違い5選
1. sed -i(インプレース編集)
# GNU sed(Linux)
sed -i 's/old/new/g' file.txt
# BSD sed(macOS)
sed -i '' 's/old/new/g' file.txt
# ^^ 空文字列のバックアップ拡張子が必須
GNU版の sed -i はバックアップ拡張子なしで直接編集できますが、BSD版は拡張子の指定が必須です。これは最も多くの人がハマるポイントでしょう。
2. dateコマンド
# GNU date(Linux)— 柔軟なフォーマットと日付計算
date -d "2025-01-01" +%s # 特定の日付をUNIXタイムスタンプに変換
date -d "+3 days" +%Y-%m-%d # 3日後の日付
# BSD date(macOS)— 全く別のオプション体系
date -j -f "%Y-%m-%d" "2025-01-01" +%s
date -v+3d +%Y-%m-%d
-d オプションの有無は大きな違いです。シェルスクリプトで日付計算をしようとすると、BSD版では毎回調べ直すことになりがちです。
3. ls --color
# GNU ls(Linux)
ls --color=auto
# BSD ls(macOS)
ls -G
GNU版はロングオプション --color に対応していますが、BSD版は -G フラグのみです。
4. readlink -f(絶対パス解決)
# GNU readlink(Linux)
readlink -f ./relative/path/to/file
# BSD readlink(macOS)— -f オプションがない!
# 代替手段
python3 -c "import os; print(os.path.realpath('./relative/path/to/file'))"
シンボリックリンクを辿って絶対パスを取得する readlink -f は、BSD版には存在しません。macOSのデフォルト環境でこれをやろうとすると、かなり面倒です。
5. xargsの挙動
# GNU xargs(Linux)— 入力が空なら実行しない
echo "" | xargs -r ls
# → 何も起きない(-r: 入力が空なら実行しない)
# BSD xargs(macOS)— -r オプションがない
echo "" | xargs ls
# → カレントディレクトリのlsが実行されてしまう
これらの違いは、macOSがBSD系Unixを起源とし、LinuxがGNUプロジェクトのツール群を採用していることに由来します。どちらが「正しい」というわけではなく、単に異なる実装です。
GNU coreutilsとは
GNU coreutils(GNU Core Utilities)は、GNUプロジェクトが提供するUnixの基本コマンド群です。以下のようなコマンドが含まれています。
| カテゴリ | 含まれるコマンド例 |
|---|---|
| ファイル操作 | ls, cp, mv, rm, mkdir, rmdir, ln, chmod, chown |
| テキスト出力 | cat, head, tail, echo, printf, wc, sort, uniq |
| シェルユーティリティ | date, sleep, env, nohup, timeout, basename, dirname |
| ファイル情報 | stat, readlink, realpath, du, df |
Linuxディストリビューションではこれらがデフォルトで入っていますが、macOSにはBSD版の同名コマンドが入っています。
HomebrewでGNU coreutilsを導入する
前提条件
Homebrewがインストールされていない場合は、先にインストールしてください。
# Homebrewのインストール(未インストールの場合)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Step 1: coreutilsのインストール
brew install coreutils
これだけで、GNU版のコマンドが使えるようになります。ただし、macOSのBSD版コマンドと名前が衝突しないよう、GNU版にはgプレフィックスが付きます。
# gプレフィックス付きで使える
gls --color=auto
gdate -d "+3 days"
greadlink -f ./some/path
gsed -i 's/old/new/g' file.txt
gsort --version-sort
Step 2: PATHを設定してGNUコマンドをデフォルトにする
gプレフィックスなしで使いたい場合は、PATHにGNU coreutilsのディレクトリを追加します。
# Intel Mac の場合
echo 'export PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"' >> ~/.zshrc
# Apple Silicon(M1/M2/M3/M4)の場合
echo 'export PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"' >> ~/.zshrc
設定を反映します。
source ~/.zshrc
PATHの先頭にGNU coreutilsを追加すると、macOSのBSD版コマンドより優先されます。ほとんどの場合これで問題ありませんが、macOS固有の機能に依存するスクリプトがある場合は注意が必要です。
Step 3: 正しく切り替わったか確認
# GNU版に切り替わったか確認
which ls
# → /usr/local/opt/coreutils/libexec/gnubin/ls(GNU版)
ls --version
# → ls (GNU coreutils) 9.x
date --version
# → date (GNU coreutils) 9.x
--version オプションが使えるのもGNU版の特徴です。BSD版には --version がありません。
coreutils以外のGNUツールも導入する
coreutilsだけでは足りません。sed、grep、awk、find などは別パッケージとして提供されています。
おすすめGNUパッケージ一覧
# まとめてインストール
brew install coreutils findutils gnu-sed gnu-tar grep gawk
| パッケージ名 | 含まれるコマンド | 主な違い |
|---|---|---|
coreutils | ls, cp, date, readlink 他多数 | 基本コマンド全般 |
gnu-sed | sed | -i のバックアップ拡張子が不要 |
findutils | find, xargs, locate | xargs -r、find -printf が使える |
gnu-tar | tar | --exclude-vcs 等のオプション |
grep | grep, egrep, fgrep | -P(Perl正規表現)が使える |
gawk | awk | gawk の拡張機能が使える |
PATHの一括設定
各パッケージのgnubinディレクトリもPATHに追加しましょう。~/.zshrc に以下を追記します。
# GNU tools PATH設定
# Apple Silicon の場合(Intel Macは /usr/local を使用)
HOMEBREW_PREFIX="$(brew --prefix)"
export PATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnubin:$PATH"
export PATH="$HOMEBREW_PREFIX/opt/findutils/libexec/gnubin:$PATH"
export PATH="$HOMEBREW_PREFIX/opt/gnu-sed/libexec/gnubin:$PATH"
export PATH="$HOMEBREW_PREFIX/opt/gnu-tar/libexec/gnubin:$PATH"
export PATH="$HOMEBREW_PREFIX/opt/grep/libexec/gnubin:$PATH"
export PATH="$HOMEBREW_PREFIX/opt/gawk/libexec/gnubin:$PATH"
# manページも同様に設定(任意)
export MANPATH="$HOMEBREW_PREFIX/opt/coreutils/libexec/gnuman:$MANPATH"
設定後、ターミナルを再起動するか source ~/.zshrc を実行してください。
導入後にできるようになること
GNU coreutilsを導入すると、以下のようにLinuxと全く同じコマンドが使えます。
日付計算が簡単に
# 3日後の日付
date -d "+3 days" +%Y-%m-%d
# 先月の末日
date -d "$(date +%Y-%m-01) -1 day" +%Y-%m-%d
# UNIXタイムスタンプ → 日付
date -d @1735689600 +"%Y-%m-%d %H:%M:%S"
sed -i がそのまま使える
# バックアップ拡張子なしでインプレース編集
sed -i 's/foo/bar/g' config.txt
# 複数ファイルを一括置換
find . -name "*.txt" -exec sed -i 's/old/new/g' {} +
readlinkで絶対パスを取得
# シンボリックリンクを辿って絶対パスを取得
readlink -f ./relative/path
# カレントディレクトリの絶対パス
readlink -f .
sortの追加オプション
# バージョン番号順ソート
echo -e "v1.2\nv1.10\nv1.9" | sort -V
# → v1.2, v1.9, v1.10(数値として正しい順序)
# Human-readableサイズ順ソート
du -h * | sort -h
timeoutコマンド
# 5秒でタイムアウトするコマンド実行
timeout 5 curl https://example.com
# タイムアウト時にSIGKILLを送信
timeout --kill-after=10 5 long-running-command
注意点とトラブルシューティング
1. PATHの優先順位に注意
which コマンドで、どちらのバージョンが使われているか常に確認できます。
which sed
# → /usr/local/opt/gnu-sed/libexec/gnubin/sed(GNU版)
# BSD版を明示的に使いたい場合
/usr/bin/sed -i '' 's/old/new/g' file.txt
2. スクリプトのポータビリティ
GNU coreutilsを導入した自分の環境では動くが、他の人のmacOSでは動かない——ということが起こり得ます。
# ポータブルに書くなら、両方に対応する
if sed --version 2>/dev/null | grep -q GNU; then
sed -i 's/old/new/g' file.txt
else
sed -i '' 's/old/new/g' file.txt
fi
チーム開発では、READMEにGNU coreutilsの導入手順を記載するか、上記のような分岐を入れると親切です。
3. Makefileやシェルスクリプトでの注意
CI/CD環境(GitHub ActionsのLinuxランナー等)ではGNU版がデフォルトです。ローカルのmacOSでもGNU版にしておけば、環境間の差異を減らせます。
4. Homebrewのアップデート
定期的にアップデートしましょう。
# Homebrew自体とパッケージを更新
brew update && brew upgrade
GNU coreutilsの導入は「Linuxのチュートリアルや技術記事をそのまま試せる」という大きなメリットがあります。学習効率が格段に上がるので、macOSでコマンドラインを学ぶすべての人におすすめです。
まとめ
macOSのBSD系コマンドとLinuxのGNU系コマンドには、見た目は似ていても挙動が異なる部分が多くあります。
解決策はシンプル:
- ①
brew install coreutils findutils gnu-sed gnu-tar grep gawk - ②
~/.zshrcにPATHを追加 - ③これでLinuxと同じコマンド環境の完成
特に効果が大きいポイント:
sed -iがバックアップ拡張子なしで使えるdate -dで直感的な日付計算ができるreadlink -fで絶対パスが取得できるxargs -rで空入力時の誤実行を防げる- Linuxの技術記事やチュートリアルをそのまま試せる
macOSユーザーでコマンドライン操作をよく行う方は、ぜひ導入してみてください。

