Windows GitBash と Mac とで date コマンドの仕様が違った

Windows 環境で使っている GitBash (Git For Windows) と、Mac の Bash とで、date コマンドの挙動が違った。

目次

なんで違いがあるの?

コレは Mac が BSD 系、Windows GitBash や Linux が GNU 系といわれる OS の違いによるもの。

MacOS は FreeBSD をベースに開発された Darwin と呼ばれる OS が基礎になっている。だから BSD 系といわれる。

Linux (いわゆる GNU/Linux)、および Windows 環境に GNU ツール群を提供する Cygwin や MSYS (GitBash 含む) は、GNU プロジェクトのツールをベースにしているので、GNU 系と区別される。

要するに「Unix・Linux」とひとまとめにされている OS の源流が違うので、コマンドのオプションに違いがあったりするというワケだ。

date コマンドの違い

違いの全量を押さえているワケではないが、主に以下のようなオプションの違いがある。

文字列からシリアル値を取得する

文字列 "2017-01-01" をシリアル値に直す。

# Mac (BSD) の場合 : 「-j -f」オプション
MY_DATE=`date -j -f "%Y-%m-%d" "2017-01-01" "+%s"`

# Linux・Windows (GNU) の場合 : 「-d」オプション
MY_DATE=`date -d "2017-01-01" +%s`

両方ともコレで、2017年1月1日のシリアル値「1483252508」が得られる。

「シリアル値 + 1日後」のシリアル値を得る

# Mac (BSD) の場合 : 「-v」オプションと「+1d」で1日後
TOMORROW=`date -r 1483252508 -v +1d +%s`

# Linux・Windows (GNU) の場合 : 「-d」オプションと「1 day」で1日後
# "【日時の文字列表現】 【1 day】" とするためにシリアル値に「@」を付け内部で文字列として展開
TOMORROW=`date -d "$(date -d @1483252508) 1 day" +%s`

コレで2017年1月2日のシリアル値「1483338908」が得られる。どちらも「+%s」でシリアル値に変換できる。

シリアル値を文字列に変換する

# Mac (BSD) の場合 : 「-r」オプション
DATE_STR=`date -r 1483338908 +"%Y-%m-%d"`

# Linux・Windows (GNU) の場合 : 「-d」オプションと、Unix 時間の先頭に「@」を付与
DATE_STR=`date -d @1483338908 +"%Y-%m-%d"`

+"%Y-%m-%d" 部分は、どちらの場合でも "+%Y-%m-%d" と書いても問題なかった。


とまぁこんな感じでオプションや記法に差異がある。

他に BSD 系・GNU 系で差異があるコマンドは?

他のコマンドも細々と差異がある様子。

ちなみに、Mac で GNU 版のコマンドを使えるようにする GNU CoreUtils というモノもあるらしい。

というワケで GitHub 草生やしスクリプトを修正

というワケで、OS 判定して date コマンドのオプションの違いを吸収した gh-contributions.sh の修正版を公開する。

コレで Mac でも Windows でもサボサボ。(ぁ