[PHP-users 5448] Re: コマンドライン版実行時のオプションエラー

Youichi Iwakiri php-users@php.gr.jp
Fri, 15 Feb 2002 21:49:09 +0900


いわきりです

Masaki Fujimoto wrote in <20020215154517.8ED5.FUJIMOTO@studio.co.jp>:
 >> ありゃりゃ、私の知り得るところのshellの動作は
 >> #!/hoge/program argument-lists ...
 >> に関してはトランスペアレンシーに機能すると思っていました。
 >> 違う環境もあるのですね。出来ればそれらのshellを紹介して頂けると
 >> ありがたいです。
 >僕もそう思っていて、家のRedhat 7.2で試してみたら早川さんと同じ結果が出て
 >驚いてしまったのです。で、今ちょっとためしてみたところ、
snip
 >Redhat 6.2
 >Redhat 7.2
 >だと一つの引数として渡されます。Solaris(Ultra5)に至っては最初の引
 >数だけしか送られてきません。つまり
 >
 >#!/foo/args -a -b -c
 >とすると
 >argv[0]: /foo/args
 >args[1]: -a
 >args[2]: ./test
 >となってしまいます。いまさらながら驚きました。BSD系とSystemV系で動作が違
 >うんでしょうか?調べてみればきっとBugDBにあがってると思いますが...

なるほど、shellが解釈するmagic numberの扱いが
OSにより異なるようですね。
#昔そういうのがあったような思いがあります。

HAYAKAWA Hiroshi wrote in <B8932989.352A%hayakawa@sam.hi-ho.ne.jp>:
 >> 利用人口数的にも多いと思われるLinux系の極一部のディストリビューション依存なの
 >> か
 >> はたまたshell依存なのかcron依存なのか非常に気になります。
 >> 下記のプログラムがどの様な出力をするのか教えて頂けるとありがたいです。
 >RedHat系ですが、VineLinux2.0, VineLinux2.1では下記のようになりました。
 >argv : 2 , ./test.prog
 >argv : 1 , -a -b -c ddd
 >argv : 0 , args

まさしくLinux系殆どに相当しそうです。

 >ふじもとさんいわく、カーネルによるらしいとのことですので、
 >プログラム中に書けるものはプログラム中に書いとくのがよさげですね。
 >(使い倒してはいませんので、今回のエラーが初事例でした)

実はbug-dbも覗いていたので、恐らく初出だとは思ってました。
#あんまりコマンドライン版PHPは使われていない。
#コマンドラインから細かくオプションを指定して利用している人がいない
#コマンドライン版用に用意したphp.iniを必要時に書きなおして利用している
辺りが現状かなと思っています。


Masaki Fujimoto wrote in <20020215154517.8ED5.FUJIMOTO@studio.co.jp>:
 ># なんだか無知をさらけだしているような

いや、私も知りませんでしたので貴重な情報提供でありがたく頂いときます :)

 >あと、patchの件ですが「特定の環境専用」ならいわきりさんのおっしゃる通り
 >簡単ですが(ただparseすればいいだけなので)、汎用的なものとなるとちょっと
 >難しいかな、という気がするのですが。

まさしく特定なマイナー環境であれば本家に一切フィードバックしない簡易patch
で手を打とうかなと思ってました。

Redhat系で問題に成るなら小さな問題じゃ済まされないですね。

% /usr/local/bin/php -q -d max_execution_time=0 foo.php
は問題無しと思いますので一時しのぎとしては

変更前
foo.php:
#!/usr/local/bin/php -q -d max_execution_time=0
<?php
 // sample code
?>

変更後(二つに分ける)
foo.prog:
#!/usr/bin/sh
/usr/local/bin/php -q -d max_execution_time=0 foo.php

foo.php:
<?php
 // sample code
?>

cronで呼び出すのはfoo.progってことでどうでしょうか?

/usr/src/linux/fs/binfmt_script.c辺りでcheckしてるようですので
そこを直すべく働きかけるべきか、PHP側で吸収すべきか悩みますね。

影響の及ぶ範囲からはPHP側で対処ってことが手っ取り早そうですけど。

#PHP利用者でコマンドライン版を使ってる人は少ないとは思っていましたが
#オプション指定での起動をスクリプトから行おうとする人は
#本家含め10人もいなかったりして