山本です。

>私には文法エラーと書いてあるようには読めませんでした。

すみません、リンクが間違ってました(汗)

  http://www.linux.or.jp/JM/html/LDP_man-pages/man7/glob.7.html

で、「領域指定は陽に `/' 文字を含むことはできない。これは文法エラーとなる。」とあります。

//////////////////////////////////////////////////////////////////////////////////////////

[ruby-dev:16555]以下のスレッドで、

  1. fnmatch でも **/ { } が使えたほうがいい。
  2. FNM_PATHNAME は **/ があれば必要ないのではないか。現在の fnmatch のデフォルト動作は、
     シェルと異なり扱いにくい

という意見を読んで、自分でも

  3. { } は glob の前でやっているが、{ } が '/' を含めないようにしてしまえば、
     fnmatch に移せるんではないか?現在 { } は別々のパターンとして展開している
     同じパスを複数回処理してしまうが、fnmatch に移せば [ ] 同様に早いし、同じパスは
     1度だけというようにできる。

という考えがあったので、

  a. { } を globの前ではなく、fnmatch で実装する。
  b. **/ も fnmatch で使用可能にする。これに伴い、File::FNM_PATHNAMEは廃止する。
  c. { } と [ ] は '/' を含むことはできない。(例外を出す)

の仕様がよさそうな気がしました。

//////////////////////////////////////////////////////////////////////////////////////////

>うむむ、Dir.glob内部でfnmatch()を呼ぶ時にFNM_PATHNAMEを指定
>するようにすると解決する問題なのかな。

FNM_PATHNAME では解決しないと思います。globでは '/' で分割したパターンに fnmatch を呼んでいるので、
パターンには '/' が残っていません。

glob_make_pattern() で、単に '/' ではなく、マジックを考慮して分割すればよさそうですが・・・

上の仕様 c があれば、

  void check_pattern(const char *s) /* 仕様 c に従い、例外を出す */

とか定義して、Dir.glob と File.fnmatch の前に呼べば「単に'/'」の部分はそのままでよさそうなんですが、
まだよくわかりません。