From: "U.Nakamura" Date: 2005-01-25T16:34:49+09:00 Subject: [ruby-dev:25512] Re: priority between commandline option and RUBYOPT env variable こんにちは、なかむら(う)です。 In message "[ruby-dev:25507] Re: priority between commandline option and RUBYOPT env variable" on Jan.25,2005 15:31:28, 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