Namazu-devel-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Do NOT use system()



 From: knok@xxxxxxxxxxxxx
 Subject: [namazu-devel-ja] Re: Do NOT use system()
 Date: Wed, 31 Jul 2002 13:33:02 JST

 > >> やっぱり util.pl あたりに system() の代替関数を用意しましょうか。
 >   今から導入するよりは、HEAD (2.1)に入れるのが良いような気がします。

Perlクックブックを見ていて気が付きましたが、Perl の system() は、
  system("/bin/ls *");
と
  system("/bin/ls", "*");
のようにリスト形式で起動するのとでは、シェル(/bin/sh -c)を呼ぶか否
かでえらい違うということに、いまごろ気が付きました。ということは、
標準(エラー)出力をリダイレクトする必要のない外部コマンド起動には、
system(LIST) 形式なら問題なくなるとおもいますがどうなのでしょうか。
たとえば、msword.pl の
  system("$wordconvpath $options $tmpfile $ofile");
は、$options を @options となるようにして、
  system($wordconvpath, @options, $tmpfile, $ofile);
と変えるということです。pdftotext を起動するところも同様です。
これは簡単なので、ぼくの解釈が間違ってなければすぐにやってしまって
いいんじゃないかな。


一方で外部コマンドの標準出力や標準エラー出力を利用する場合は、今は
  system("$wordconvpath -o e $tmpfile2 > $tmpfile");
のようにシェル起動の上で一時ファイルにリダイレクトして使ってますが、
シェル起動は危険であるからいっさい禁止とするなら、別の workaround 
を考えないといけませんよね。

(コードが煩雑になりますが)地道に fork()/exec() を使うように直すか、
少しでも見易くということなら、stderr が不要なら $fh->open("-|"); 
とするか、stderr が必要なら IPC::Open3 ということになるのでしょうか。
うーん、どれが良いのか判別がつけられません...

あと、同じことですが、
    my $fh_cmd = util::efopen("$wvversionpath $tmpfile |");
もシェルを起動しているのですよね?これも直すとなると結構たいへんに
なってしまう気が... やるべきことならやらないといけませんが。

# そういえば、2.0.11pre1 の pdf.pl の status() の中の
#        my $ret = `$pdfconvpath 2>&1`;
# は、Windows ではエラーになって動かないです。これは直すべきです。
--
馬場  肇 ( Hajime BABA )                  E-mail: baba@xxxxxxxxxxxxxxxx
宇宙科学研究所 宇宙科学企画情報解析センター
--