nlコマンド Advent Calendar 2020最後の記事です。今後のnlコマンドの方向性についてまとめます。
GNU coreutils
coreutilsには今後の方針がある程度示されている機能があります。
今後もやらないこと
Coreutils - rejected feature requests
このページにはリジェクトされた機能一覧がまとめられています。実施しないことが決まったにもかかわらず、何度も同じ機能リクエストが投稿されることを防ぐためです。nl
には過去にリジェクトが決定された機能はありません。
cat -n
RE: cat -n with different format?
cat -n
については、セパレータのフォーマットを変更したいと要望がありリジェクトされた経緯があるようです。セパレータを:
に変えたいという要望に対し、「sed
やnl
を使えばできるよ」と答えながらもawk
とgrep -n
の例を示しています。そこはnl -s
の例も示してあげて…
予定されていること
TODO
coreutilsのリポジトリにはTODOというファイルがあり、今後対応すべきことがまとめられています。しかしながらnl
に関する項目はありません。
メーリングリストでの議論
PBRE
nl: add way to exclude matching lines from getting numbered!
比較的最近の機能提案で、正規表現を用いた付番方式pBRE
に対して、「正規表現がマッチしなかった行に付番するPBRE
」という拡張機能が提案されたことがあります。しかし、(bug-coreutilsのメーリングリストに投げてしまったためか?)今のところレスがついていません。
私個人の意見としては、一部の行だけ付番するよりも一部の行だけ付番から除外する機会の方が圧倒的に多いと思いますので、拡張する価値はあるんじゃないかなと思います。とはいえ「一部の行だけ」というニーズそのものがどれだけあるのか、というと自信はありません。
その他
自分なりに案を捻り出してみると、機能改良案は3つあります。
処理速度の改良
この記事に関連して、行番号を付加する専門とするnl
としてcat -n
より遅いのはちょっと存在価値が危ぶまれると思います。です。もちろんコマンド名が短くタイプ数の少なさでは勝るのですが、選ばれる理由としては少し魅力が乏しいような気がします。
最大値の拡張
この記事に関連して、行番号として大きな値をカウントすることはなさそうですが、大きな値をサポートしておくことは、coreutilsの他のコマンドとの一貫性を持たせるために意味のあることだと思っています。最近のアップデートでは、bc
とfactor
がすべての環境でGNU MPを利用するようになりました。MPは任意精度計算ライブラリであり、メモリが尽きない限り整数の最大値制約がなくなります。seq
やnl
など整数の供給源となりうるコマンドでも、MPを利用した実装にしてみても良いかもしれません。
論理ページ無効化オプション
この記事に関連して、結果的に-dオプションのGNU拡張という落とし所の対応になってしまいましたが、本当は独立した新しいオプションとしたほうがわかりやすかったかなと、今更ながらに思っています。
*BSD
NetBSDをはじめBSDではほとんどコマンドの改良はされていない印象です。
POSIX
とはいえ、nl
にはPOSIXとの非互換がまだ残っていますから、機能拡張よりもそちらの対処が先になるでしょう。
BusyBox
BusyBoxのnl
においては、当面の実装項目は「論理ページ」のサポートでしょう。しかしながら、「ほとんど使われていない機能との互換」と「フットプリントの増加」のトレードオフは悩みの種となりそうです。
ソース内のコメント
実際にソースを見ると、論理ページの実装予定はあるようです。「not implemented yet」だそうです。
static const char nl_longopts[] ALIGN1 =
"body-numbering\0" Required_argument "b"
// "footer-numbering\0" Required_argument "f" - not implemented yet
// "header-numbering\0" Required_argument "h" - not implemented yet
// "section-delimiter\0" Required_argument "d" - not implemented yet
"line-increment\0" Required_argument "i"
// "join-blank-lines\0" Required_argument "l" - not implemented yet
// "number-format\0" Required_argument "n" - not implemented yet
"no-renumber\0" No_argument "p" // no-op so far
"number-separator\0" Required_argument "s"
"starting-line-number\0"Required_argument "v"
"number-width\0" Required_argument "w"
;