NetBSDのdate(1)コマンドは、なぜデフォルトでは分かりにくい結果を返すのか?

はじめに

NetBSDでLANG=ja_JP.UTF-8な環境で生活しているが、date(1)コマンドを 実行すると、分かりにくい結果の文字列が返って来るのがなぜなのか ずっと気になっていた。


$ date
月 7月 10 21:00:41 JST 2017

やっと重い腰を上げて調べてみたので、結果を書いておく。

date(1)のソースコードを見てみる

src/bin/date/date.cに出力の処理は書かれているようである。 特にフォーマットを指定しない場合の出力フォーマットを決めている箇所を 探すと、以下の箇所が見付かった。141行目である。


   132          if (!rflag && time(&tval) == -1)
   133                  err(EXIT_FAILURE, "time");
   134
   135
   136          /* allow the operands in any order */
   137          if (*argv && **argv == '+') {
   138                  format = *argv;
   139                  ++argv;
   140          } else
   141                  format = "+%a %b %e %H:%M:%S %Z %Y";
   142
   143          if (*argv) {
   144                  setthetime(*argv);
   145                  ++argv;
   146          }

どうやら、ロケールの標準値を指定する等ではなく、私が見やすくないと思っていた フォーマットで決め打ちになっている。

POSIXの規格を見てみる

POSIX(これはIEEE 1003.1-2008のことであって、Open Groupのウェブサイトで公開されているものと思っている)の規格の内容を調べてみると、date(1)コマンドに関する最新版はhttp://pubs.opengroup.org/onlinepubs/9699919799/utilities/date.htmlで公開されているようである。ここで読んで行くと、以下のような記述があった。


STDOUT

    When no formatting operand is specified, the output in the POSIX locale shall be equivalent to specifying:

    date "+%a %b %e %H:%M:%S %Z %Y"

ここで使われているのは「shall」である。RFC 2119の用語に従えば、 以下のような意味なので、従わないという選択肢はない。

1. MUST   This word, or the terms "REQUIRED" or "SHALL", mean that the
   definition is an absolute requirement of the specification.

結論

NetBSDのdate(1)コマンドは、私には見やすくないが、POSIX標準に従っているために、変更されることはないことが分かった。

であれば、仕方がないので、


$ alias date='date +%c'
とでもしておくしかない。

コメント

このブログの人気の投稿

#5000へCメールを送れないau端末でezweb.ne.jpの電子メールアドレスをIMAP4/SMTPで扱う方法

Vaio Pro 11/13用のサードパーティーのACアダプター

Windows 7 Professional用のNFSクライアントを使う (NFS 4.1のみ)