はじめに
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'
とでもしておくしかない。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。