自分自身が起動されたかどうかを確認

なんでもかんでもテストしやすいようにということで、夏頃 Perl を書いていて思いついた $0 と __FILE__ が一致したら実行という手法、実は案外ポピュラーだったようで、気をつけて見てみると意外と見かける。

でまぁ、「ちくしょう!すごいこと思いついたと思ったのに!」というのはどうでもいいとして、確認の方法で自分はわざわざフルパスに展開してから比較してたんだけど、実はその必要ないのかな?というのが気になって確認してみた。

Ruby

$0 も __FILE__ も原則同じように取れるってことでいいのかな?

puts '$0       : ' + $0
puts '__FILE__ : ' + __FILE__

こんなのを書いて動かしてみる。フルパスになる場合もならない場合もあるけど、食い違うということはなさそうだ。CLI で起動したときはフルパスになったりならなかったり、ブラウザから CGI で呼び出すとどちらもフルパスを返す。

ということは Ruby において自分自身が起動されたかどうかを確認するためには

$0 == __FILE__

だけを見ればよさげ。

PHP

こんなもので確認1

print '__FILE__        : '.__FILE__."\n";
print 'SCRIPT_NAME     : '.$_SERVER['SCRIPT_NAME']."\n";
print 'SCRIPT_FILENAME : '.$_SERVER['SCRIPT_FILENAME']."\n";
  • CLI で動かすと __FILE__ だけがフルパス
  • ブラウザからアクセスすると SCRIPT_NAME 以外がファイルシステム上のフルパス
    • SCRIPT_NAME は URI 上の絶対パス

ということは

realpath( $_SERVER['SCRIPT_FILENAME'] ) == __FILE__

を見ればよさげ。

……。

なげぇよ。

他の言語は気が向いたら調べるかもしれませんけど、何か情報がありましたら嬉しいです。

  1. PHP_SELF を使っていいのは小学生まで。 

More