The Design and Implementation of
the Gracious Days

シェルスクリプトの記事の動作チェックをしていた時に、BSDのuniq(1)の出力がPOSIXに準拠していないことに気がついた。

% jot -b 1 100 | uniq -c
 100 1

SUSv3のOUTPUT FILESの節には、次のように書いてある。

If the -c option is specified, the output file shall be empty or each line shall be of the form:

"%d %s", <number of duplicates>, <line>

BSDのコードは昔から"%4d %s"だ。この書式指定は少なくとも1980年まで遡ることができる。ずっと変わっていない。確認してみたところ Solarisの実装"%4d" だ。SCO UNIX はソースが確認できないが動作を調べると"%4d"っぽい。

古いUNIXのソースを遡ってみると4th Editionまで遡ることができた。1975年5月のソースだが、これも"%4d" だ。

一方GNU coreutils (確認したバージョンはuniq 8.4)は次のように表示する。

    100 1

ソースファイルを確認する限りでは"%7" PRIuMAXのようだ。Gitの履歴からたどれるもっとも古い1992年11月のバージョンでは"%7d"になっている。ということは、POSIXを信じてuniq -c | cut -f 1 -d " "とかすると痛い目をみる、ということだろうか。

uniq -cの出力が%dになっている環境を知っている方、情報求む。


Next post: DTrace における ELF シンボルの置換

Previous post: DTrace における同じプローブに対する複数のアクションとcopyin()