死蔵コマンド

スラッシュドットに「死蔵しているコマンド、どのくらいありますか?」なんて記事が載ってた。Plan9なら、

cpu% ls /bin | wc
    339     339    3673

でほぼ正確なコマンド数がわかる*1。339個。最近は組込み用のBusyBoxでも、200個近くのコマンドをサポートするようになっているから、ずいぶん少ないことがわかる。

これでいいのは、環境変数$pathはカレントディレクトリと/binだけだから。

cpu% echo $path
. /bin

この日記では何度も書いているけど、/binはユニオンディレクトリになっている。

cpu% ns |grep /bin
bind  /386/bin /bin 
bind -a /rc/bin /bin 
bind -a /usr/oraccha/bin/rc /bin 
bind -a /usr/oraccha/bin/386 /bin

一方、UNIXerであれば、カレントディレクトリを$pathに入れるのは気持ち悪い、と直感的に感じるだろう。UNIX FAQには、次のように書かれている。

2.13) $PATH に '.' を入れると、どんな不都合が起こるのですか。
(略)
PATH のどこかに "." を入れると便利です。カレントディレクトリのプログラ ムを実行する時、"./a.out" の代わりに "a.out" と入力することができます。 しかしそこには落し穴があります。
"." が PATH の最初にある場合に何が起こるか考えます。カレントディレクト リは "/tmp" のようにだれでも書き込めるとしましょう。もし、たまたま誰か 違うユーザーが残した "/tmp/ls" と言う名前のプログラムがあったとします。 そしてその時 (もちろん普通の "/bin/ls" プログラムを走らせるつもりで) "ls" と入力すると 、シェルは他のユーザーが作ったプログラムの "./ls" を 代わりに走らせるでしょう。すると言うまでもなく、このような見知らぬプロ グラムを実行してしまい驚くことでしょう。
(略)

/tmp/lsの実行によって、トロイの木馬を仕掛けられてしまうかもしれない。

Plan9の場合、名前空間がプロセスごとに異なるので、このような落とし穴は存在しない(もちろん墓穴を掘るのは自由だが)。ちなみに/tmpもユーザごとに異なっていて、ログイン時に/usr/oraccha/tmpをbindするようになっている。

*1:死蔵かどうか調べるには、コマンド履歴を検索するのかな?