こんにちは、なかむら(う)です。

In message "[ruby-dev:25507] Re: priority between commandline option and RUBYOPT env variable"
    on Jan.25,2005 15:31:28, <eban / os.rim.or.jp> wrote:
| > 問題は,「コマンドラインオプションは RUBYOPT 環境変数の設定よりも
| > 優先されるべきではないか」という点です.
| 
| これは結構難しいんじゃないかと思います。
| 
| Rubyには
|   $SAFE=1のときはRUBYOPTを処理しない
| というセキュリティレベルの制限があります。つまり-T1のときは
| RUYBOPTを処理してはいけないわけです。
| 現在の実装だとコマンドラインを先に処理して、safe levelを設定
| し、その後で$SAFE=0かどうか判断してRUBYOPTの処理をしてます。
| だからRUBYOPTがコマンドラインオプションに勝ってしまいます。

と、いう話について考えながら、ソースコードを眺めてたのですが、
RUBYOPTに-Tオプションを指定した時の処理が不思議なことになって
いるのに気づきました。

意図としては、

 * -Tが指定された場合、後ろに他のオプションがあっても無視する
 * -Tのみが指定され、セキュリティレベルの指定がなかった場合、
   -T1が指定されたとみなす

だったのだと思いますが、実際には、

 * -Tの後ろに数値が一桁だけの場合、すべて-T1として扱われる
 * -Tの次の1文字が何であるかに関わらず、それ以降に数値として読
   み取れる文字列がある場合、その数値が採用される

となっています。

というわけで、この問題を修正したうえで、ついでに、

 * -は省略できるようにする(RUBYOPT=T2、とかいう指定を可能にす
   る)

という変更を加えたパッチを以下に。

Index: ruby.c =================================================================== RCS file: /home/cvs/ruby/ruby.c,v retrieving revision 1.95 diff -u -1 -p -r1.95 ruby.c --- ruby.c 15 Jan 2005 05:57:32 -0000 1.95 +++ ruby.c 25 Jan 2005 07:18:52 -0000 @@ -711,3 +711,3 @@ proc_options(argc, argv) while (ISSPACE(*s)) s++; - if (*s == '-' && *(s+1) == 'T') { + if (*s == 'T' || *s == '-' && *(s+1) == 'T') { int numlen; @@ -715,3 +715,3 @@ proc_options(argc, argv) - s += 2; + if (*s != 'T') ++s; if (*++s) {
それでは。 -- U.Nakamura <usa / garbagecollect.jp>