dateコマンドのオプションについて

前回のエントリで当初「date -s "`LANG=C date`"」というコマンドをご紹介していたのですが、このオプションでは誤動作する場合があるとのご指摘をいただきました。具体的には、環境変数LC_ALLまたはLC_TIMEが設定されている場合に、誤った時刻が設定されてしまいます。

# LANG=C date
Wed Jul  4 02:47:29 JST 2012
# export LC_ALL=ja_JP.UTF-8
# LANG=C date
2012年  7月  4日 水曜日 02:47:38 JST

この状態でdate -sコマンドを投入すると、文字列の解析に失敗して常に午後8時となります。

# export LC_ALL=ja_JP.UTF-8
# date -s "`LANG=C date`"
2012年  7月  4日 水曜日 20:12:00 JST

ロケールの設定はLC_ALL→LC_TIME→LANGという優先順位になっているので、以下のように書くのが正解でした。大変失礼いたしました。

# date -s "`LC_ALL=C date`"

前回のエントリはロケールに依存しない書き方「date `date +'%m%d%H%M%C%y.%S'`」に修正しました。CPU使用率の高騰についてはもう片付いたころかと思いますが、Twitterでいろいろ教えていただいたので、dateコマンドのオプションの書き方をいくつかご紹介しておきます。

# date `date +'%m%d%H%M%C%y.%S'`
# date -s "`LC_ALL=C date`"
# date -s now
# date -s today
# date -s '1 sec -1 sec'
# date -s 'tomorrow yesterday'
# date -s 'next week last day -96 hours -1440 minutes -86400 seconds'

nowが短くて覚えやすいですね。dateコマンドはオプションをBisonで構文解析しているそうで、かなり自由に書くことができます。