2009/05/14

シェルスクリプトのあぶないところ

pythonのblogを書いていて気がついたのですが、 スクリプトを作成する時に先頭を'#!'で始めてインタプリタを指定する事がよくあります。
その記事ではスクリプトの先頭を次のように書く事もできました。

#!/usr/bin/env python

動きとしては'#!'が特別な意味を持つものとしてOSに認識されているので、 /usr/bin/envを実行し"python", "is_equal.py"を引数として渡しています。
さらに/usr/bin/envはPATH環境変数から"python"というコマンドを探して、 /usr/local/bin/pythonのようにフルパスで起動し、"is_equal.py"スクリプトの内容を実行させようとします。

rubyやらtclshやらは/usr/local/binに配置されているという事は普通なので 不特定多数の環境で動くコードを提供しようとすると"#!/usr/bin/env"はよく使う手なのです。
この書き方はサンプルコードを配布する上では良いのですが、ユーザーがPATH環境変数を上書きしてしまうとうまく動きません。
例えばrubyが/usr/local/bin以下と~/bin以下に存在しているような場合に、それぞれライブラリが異なっていて片方ではちゃんと動いて、もう片方では動かないとか、隣りの人は動くのに、自分は使えないとか、そういう状況で「使えない」とだけメールがきてサポートするような羽目になるかもしれません。
setuidされているわけでもないので、不用意に管理者権限でコマンドが実行されたりはしませんが、 システム管理を仕事にするのなら、こういうところをちゃんと管理して意図した通りに動かしてこその管理者です。

よいマナー(作法)はあるのですが、そういうのがまとまっているところってあまりないですよね。
少なくとも必ずこれ読んどけ的なものの定番はない気がします。

0 件のコメント: