メインコンテンツへスキップ
中級15分で読める

macOSでGNU coreutilsを導入してLinuxと同じコマンド環境を作る

HomebrewでGNU coreutilsをインストールし、macOSでLinuxと同じコマンドオプション・挙動を実現する方法を解説。sed -iやdate、readlinkなどBSD系とGNU系の違いに悩むすべての人へ。

🎯 この記事で学べること

  • 1
    BSD系コマンドとGNU系コマンドの違いを具体例で理解できます
  • 2
    HomebrewでGNU coreutilsを導入する手順がわかります
  • 3
    PATHを設定してGNUコマンドをデフォルトにする方法を学べます
  • 4
    coreutils以外の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だけでは足りません。sedgrepawkfind などは別パッケージとして提供されています。

おすすめGNUパッケージ一覧

# まとめてインストール
brew install coreutils findutils gnu-sed gnu-tar grep gawk
パッケージ名含まれるコマンド主な違い
coreutilsls, cp, date, readlink 他多数基本コマンド全般
gnu-sedsed-i のバックアップ拡張子が不要
findutilsfind, xargs, locatexargs -rfind -printf が使える
gnu-tartar--exclude-vcs 等のオプション
grepgrep, egrep, fgrep-P(Perl正規表現)が使える
gawkawkgawk の拡張機能が使える

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系コマンドには、見た目は似ていても挙動が異なる部分が多くあります。

解決策はシンプル:

  1. brew install coreutils findutils gnu-sed gnu-tar grep gawk
  2. ~/.zshrc にPATHを追加
  3. これでLinuxと同じコマンド環境の完成

特に効果が大きいポイント:

  • sed -i がバックアップ拡張子なしで使える
  • date -d で直感的な日付計算ができる
  • readlink -f で絶対パスが取得できる
  • xargs -r で空入力時の誤実行を防げる
  • Linuxの技術記事やチュートリアルをそのまま試せる

macOSユーザーでコマンドライン操作をよく行う方は、ぜひ導入してみてください。