エラーの概要LinuxベースのBashスクリプトをMacで実行しようとしたことがあるなら、おそらくこの壁に突き当たったことがあるでしょう。日付を計算する代わりに、ターミナルに次のような不満の残るテキストが表示されます。
date: illegal option -- d
usage: date [-jnRu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...
[-f fmt date | [[[mm]dd]HH]MM[[cc]yy][.ss]] [+format]
なぜこのエラーが発生するのか問題の核心は、その系譜にあります。UbuntuやDebianなどのLinuxディストリビューションでは、GNU Coreutilsが使用されています。GNU版のdateコマンドでは、-dフラグを使用して「yesterday」や「30 days ago」といった文字列を解析します。
macOSは異なります。macOSはBSDベースであり、全く異なるバージョンのdateユーティリティを使用しています。Macでは、-dフラグは実際には夏時間(Daylight Saving Time)の値を設定するために使用されます。ネイティブのMacコマンドを使用して日付計算を行いたい場合は、代わりに-vフラグを使用する必要があります。構文が大きく異なるため、Linux向けに書かれたスクリプトはmacOS上でほぼ確実に動作しなくなります。
解決策1:GNU Coreutilsをインストールする(プロ推奨の修正)これを修正する最もスマートな方法は、GNUツールをMacに導入することです。これにより、スクリプトライブラリ全体を書き換えることなく、Linuxスタイルのコマンドを実行できるようになります。Homebrewを使用すれば、2分ほどで完了します。
1. HomebrewのインストールまだHomebrewを導入していない場合は、ターミナルに以下を貼り付けてパッケージマネージャーをインストールしてください:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
2. Coreutilsのインストール次に、GNUユーティリティスイートをインストールします。このパッケージは軽量(通常15MB未満)で、すぐにインストールできます:
brew install coreutils
インストールが完了すると、GNU版のdateコマンドがgdateとして利用可能になります。これはLinux上のdateコマンドと全く同じように動作します:
gdate -d "yesterday"
解決策2:スクリプトをクロスプラットフォーム対応にするチームでスクリプトを共有していますか?全員がcoreutilsをインストールしているとは限りません。より良いアプローチは、スクリプトの先頭にOSを検出して適切なコマンドを自動的に選択する小さなロジックを追加することです。
スクリプトの例:```
macOS (Darwin) 上で実行されているか確認
if [[ "$OSTYPE" == "darwin"* ]]; then if command -v gdate > /dev/null 2>&1; then DATE_CMD="gdate" else echo "必須の依存関係 'coreutils' が見つかりません。次のコマンドでインストールしてください: brew install coreutils" exit 1 fi else DATE_CMD="date" fi
'date' の代わりに $DATE_CMD を使用
$DATE_CMD -d "2024-01-01 + 5 days"
## 解決策3:エイリアスによるショートカットコマンドを手動で実行するだけで、毎回「g」を入力したくない場合は、シェル設定で`date`を`gdate`にマッピングできます。これは個人のワークフローにおける優れたローカルな修正方法です。
- Zshの設定を開く:`nano ~/.zshrc`- 末尾に次の行を追加:`alias date='gdate'`- シェルを更新:`source ~/.zshrc`**注意:** このエイリアスはインタラクティブなターミナル内でのみ機能します。シェルスクリプトはデフォルトでエイリアスを継承しないため、単体の`.sh`ファイルは修正されません。
## 検証すべてが正常に動作しているか確認しましょう。将来の特定の日付を計算してみます:
gdate -d "2024-12-25 + 1 year" +"%Y-%m-%d"
ターミナルが`2025-12-25`を返せば、準備完了です。また、バージョンを再確認して、GNUスイートを使用していることを確認することもできます:
gdate --version
出力の最初の行に`date (GNU coreutils) 9.4`のように表示されるはずです。
## 予防のヒント- **gdateに統一する:** チームでMacとLinuxサーバーの両方を使用している場合は、すべてのスクリプトで`gdate`を使用することをルールにし、macOSのセットアップドキュメントに`coreutils`を含めるようにしましょう。- **Pythonを検討する:** 複雑な日付ロジックが必要な場合は、Pythonのワンライナーを使用してください。Pythonの`datetime`モジュールはどのOSでも同じように動作するため、BSD対GNUの悩みから完全に解放されます。- **フラグを確認する:** 重たいスクリプトを移植する前に、Macで`man date`を実行してください。BSDのフラグがLinuxで見慣れたものとどれほど違うかを素早く確認できます。

