address Logo

Env

2008/03/23

僕は Web のページを書いたまま、公開するのを忘れてしまっている事がある。このページもそうだ。何年か前に書かれたものだが忘れ去られてしまっている。そこで今更ながら公開する。

Unix の "/usr/bin/env" は実行するプログラムに渡す環境変数を制御する。Plan 9 ではこの意味での "env" を持つニーズは無い。しかし、もっと広い意味での "env" のニーズが存在する。

Python を例として挙げよう。Python は版が新しくなるに従って、どんどん膨れ上がった。僕は通常は Python 1.5 のレベルで十分なのだ。コードが小さい事はよい事だ。ローディングタイムが節約できるからね。

スクリプト毎に利用する版を指定できないものか? スクリプトの先頭に

    #!/bin/python1.5

とか

    #!/bin/python2.4

とか書けばよいではないか、と思われるかもしれないが、Python はライブラリを使っている。このライブラリは版毎に異なっている。そしてライブラリの標準インストール場所は

    /sys/lib/python

なのだ。

Plan 9 ではこの場合の対策の基本方針は次のようになるだろう。

    /sys/lib/python1.5

    /sys/lib/python2.4

を作り、それを

    /sys/lib/python

に bind する。

つまり名前空間を変更する "env" があれば問題が解決する!
そこで、そのような "env" を作った。

"env" は

    #!/bin/env python1.5

のように使う事とし、"python1.5" の場合には名前空間をどのように編成するかを

    /sys/lib/env/

に書き込む事とした。このケースでは次のようになっている。

ar% ls -d /sys/lib/python*
/sys/lib/python
/sys/lib/python1.5
/sys/lib/python2.4
ar% ls -d /sys/lib/env
/sys/lib/env
ar% ls -p /sys/lib/env
python
python1.5
python2.4
ar% cd /sys/lib/env
ar% cat python
bind /bin/python2.4 /bin/python
bind /sys/lib/python2.4 /sys/lib/python
ar% cat python1.5
bind /sys/lib/python1.5 /sys/lib/python
ar% cat python2.4
bind /sys/lib/python2.4 /sys/lib/python

つまり

    #!/bin/env /python1.5

の意味は

    /sys/lib/env/python1.5

で編成された名前空間の下で "python1.5" を実行せよ、である。

/sys/lib/python が存在しない時にはどうするか ?

    #!/bin/env python

は単に /bin/python を実行する。これは

    #!/bin/python

と同じかと言えば必ずしもそうではない。UNIX と同様に、後者の場合には python はバイナリでなくてはならないが、前者の場合にはスクリプトが許される。だからスクリプトの中で名前空間を構成すると言う考え方もあるのだ。

"env" は http://plan9.aichi-u.ac.jp/netlib/cmd/env/" に置かれている。