[Namazu-devel-ja 100] Re: Windows で動かす際に問題になりそうな箇所

SATOH Fumiyasu fumiya @ samba.gr.jp
2004年 9月 2日 (木) 15:10:31 JST


At Thu, 02 Sep 2004 02:38:54 +0900,
Tadamasa Teranishi wrote:
> その後の調査の結果、HEAD の systemcmd が Windows 環境(ActivePerl)
> では、期待した通りの動作をしないようだということが分かりました。
> 
> STDOUT, STDERR は問題なく取り出せます。
> 問題は、 
>     $status = system { $args[0] } @args;
> の部分。
> 
> 引数に例えば f* というのがあった場合、
> 
>     my @cmd = ( "command", "f*");
>     my ($status, $fh_out, $fh_err) = util::systemcmd(@cmd);
> 
> UNIX では command に引数 f* が渡り、SHELL に解釈されません。

期待通りの動作かと。ワイルドカード展開が必要なら、
呼び出し元が自前で glob("f*") すべきでしょうね。

> 一方で、Windows では、f* が SHELL に解釈され、command に
> f* が渡りません。

困ったことに、Windows (DOS) ではシェルが展開するのではなく、
プログラムが各自展開するんですよ。ですので実際のところ、
ワイルドカード展開するかどうか、また、どの引数をワイルドカード
展開するかは、プログラム次第なんです。

私の知識は Windows 95/NT どまりなので、Windows 98/98SE/Me/2000
あたりの事情はわかりません。念の為。

>     my @cmd = ( "command", "\"f*\"");
>     my ($status, $fh_out, $fh_err) = util::systemcmd(@cmd);
> 
> とすれば、f* を渡すことができますが、今度は UNIX の場合、
> "f*" が command にわたってしまいます。

プログラムにワイルドカードを渡す必要がある場面は
あるのでしょうか? 先(上)で書いたように、ワイルドカードを
展開したければ呼び出し元で glob() で展開すれば
いいんじゃないでしょうか。

-- 
-- Name: SATOH Fumiyasu  -- Home: http://www.sfo.jp (in Japanese only)
-- Mail: fumiya at net-thrust.com, samba.gr.jp, namazu.org or ...



Namazu-devel-ja メーリングリストの案内