test -older

9fansに有澤先生がtest -olderがあるのに、-newer or -youngerがないのはなぜか?というような投稿をされていた。-olderは、-otや-ntのように2つのファイルのmtimeを比較するのではなく、任意の時間とファイルのmtimeを比較する。
もちろん、否定(!)を使えばよいのだけど、!(a < b)は(a > b) and (a = b)なので、ちょっと注意が必要。あと、mtime(1)という、その名の通りファイルのmtimeを返すコマンドもあるそうな。

さて、test(1)が登場したのは、意外と新しくてUNIX V7になってから。当時から"["と書くことができた。

bashなどでは、testはbuiltinとなっているが、rcには"~"という文字列のパターンマッチbuiltinが提供されているので、testの出る幕は少ない。

おまけに「ソースコード・リテラシーのススメ」から、ありがちな話。

条件判定で用いられる [ .. (])は,現在では bash の組み込みコマンドになっていますが,旧来のUNIX互換環境では /usr/bin/[ というコマンドが/usr/bin/test へのシンボリックリンクとして用意され,条件判断も外部のコマンド(/usr/bin/test)を起動して行うようになっていました。/usr/bin/[というコマンドはとてもコマンド名には思えないため,操作ミスで作ってしまったファイルだと思って削除したらシェルスクリプトがのきなみ動かなくなってしまった,というトラブルは,かって新米rootの間でしばしば笑い話のネタになったものです。

MacOS Xだと、シンボリックリンクじゃなくて、ハードリンクだな。

$ ls -i /bin/\[ /bin/test 
3236 /bin/[     3236 /bin/test