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 系と区別される。
- 参考 : GNU/Linuxシステム - Wikipedia
- 参考 : GNU/Linux名称論争 - Wikipedia
- 参考 : Cygwin - Wikipedia
- 参考 : MinGW - Wikipedia
- 参考 : MSYS - Wikipedia
要するに「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 系で差異があるコマンドは?
他のコマンドも細々と差異がある様子。
- Linux(GNU)とMac(BSD)のsedの振る舞いの違いを解決 - Qiita …
sed
- Mac(BSD)でcpをGNU的に使う + おまけ …
cp
- GNU版, BSD版 xargsの挙動の違い - syohex's diary …
xargs
ちなみに、Mac で GNU 版のコマンドを使えるようにする GNU CoreUtils というモノもあるらしい。
というワケで GitHub 草生やしスクリプトを修正
というワケで、OS 判定して date
コマンドのオプションの違いを吸収した gh-contributions.sh
の修正版を公開する。
- GitHub - Neos21/gh-contributions: GitHub の草を生やすシェルスクリプト
- gh-contributions/gh-contributions.sh at master · Neos21/gh-contributions · GitHub
コレで Mac でも Windows でもサボサボ。(ぁ