石井です。 まつもとさん、わたなべさん、前田さん、原さん、$LOAD_PATH について フォローありがとうございます。 isii>load や require のロードパスに、、load や require を実行したスクリプトの isii>存在するディレクトリを自動的に含めるというというのは難しいでしょうか? この要望どうしてもという程ではないし、プログラムを書く側で実用上十分対処可能 なのでとりあえず引っ込めます。 ただ、、 まつもとさん> * UNIX文化的でない まつもとさん> * 本来 $0 にも __FILE__ にもフルパスが入っている保証はない には、ちょっとコメントしておきます。 たぶん、まつもとさんの「UNIX文化的でない」というのは shell や perl を念頭に おいて言っているのだと思います。 私にとって ruby というのは、スクリプトというよりも、言語である、、 という意識が強いです。そう考えたとき、C のプリプロセッサの #include "xxxx" (<xxx>にあらず) が、まさに私の要望したのとおなじ動作をしているので、私にとっては 十分 UNIX 文化のうちだと感じます。 (C のプリプロセッサは C ではないって? でも CPP+C で使用するのが常態ですし) そういえば、シンボリックリンクも同じ動作をしますし。 $0(or __FILE__) にフルパスが入っていなくても、原さんの常套句のように File.expand_path()してやれば良いのではないでしょうか? $0(or __FILE__)に相対パスが入っていても、カレントディレクトリを変更して いななければ、File.expand_pathで正しいフルパスが得られるはずです。 ただ、Ruby には -x dir とか -X dir とかスクリプトが始まるまえにカレント ディレクトリを変更してしまうオプションがあるので、この場合には原さんの 常套句が通用しませんが。 (ここんところが、ちょっと未練の残る所ではあります) ところで、原さんの常套句は、最初見たとき「おおシンボリックリンクまで おいかけてる!」と感激したのですが、 1) 複数段のシンボリックリンクは無視している(わりきっておいかけていない?) 2) シンボリックリンクが相対パスで張られているときに間違ったディレクトリを 指してしまう。 ので、うまくありません。 結局私はシンボリックリンクを追いかけるのは諦める事にして $LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__)) を使う事にしました。 $0 の替わりに __FILE__ を使う事で、わたなべさん指摘のように書き換えられる 心配がなくなるのと、load がネストした時に CPP の #inlcude "xxx" と同じ挙動が 得られるのがちょっと嬉しいです。 P.S. 前田さんの RUBYLIB を設定するという案もありだとは思うのですが、 自分の書いたスクリプトを、同じプロジェクトの仲間に NFS 上からアクセスできる ツールとして使ってもらう局面を考えた時、、 1) ユーザーに ruby スクリプトである事を意識してもらいたくない (場合によっては他の言語で書きなおすかもしれないから) 2) shell の PATH環境変数の設定以外の負担をユーザにかけたくない たとえば、最初は限定公開して $HOME/export-bin に置いて 使いそうな人に PATH に入れておいてねとアナウンスし、、有用性が はっきりしたら、システム管理者に /usr/local/bin に移してもらう といった時に、ユーザーに再設定の負担をかけたくない。 ので、RUBYLIB は使いたくないのです。 -- ┌─石井 毅────────────────────┐ └──isii / harmony.co.jp──isii@mirage.linc.or.jp─┘