namazu-dev(ring)


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

Re: mknmz --quiet



Motoyuki Kasahara <m-kasahr@xxxxxxxxx> wrote:

>> この unless $var::Opt{'quiet'} をいちいちつけるのは面倒です
>> し、忘れてしまいがちです。そこで、
>    : 略
>> とすれば、unless $var::Opt{'quiet'} は一ヶ所で済みます。しか
>> し、nmz_print() を使わずに、うっかり print "foobar\n" と書い
>> てしまうかもしれません。
>
>私は何故か、そういうのを苦に思わないんですよね〜。
>特異な体質なんでしょうか。

僕は「忘れてしまいがち」という危険性に不安を感じます。自分は
忘れっぽいので。

# だから fclose() や free() の類いも苦手です ;-)


>> Windows でも動作させるにはファイルに書き出せばいいと思います。
>    : 略
>> どうすればいいと思います? > みなさま
>
>あらかじめ STDOUT を close しておくとどうなるんでしょう?
>荒業な気もしますが、ちょっと試した限りでは、文句は言って来ないみ
>たいですけど。(^^;)

あ、なるほど。そんな方法があったとは! ただ、 -w つきで perl
を動かすと warning が出るのが難点です。

  % cat stdout-close.pl
  print "foo\n";
  close(STDOUT);
  print "bar\n";
  print STDERR "baz\n";

  % perl stdout-close.pl
  foo
  baz

  % perl -w stdout-close.pl 
  foo
  print on closed filehandle main::STDOUT at stdout-close.pl line 3.
  baz

どうしたものか…と、思っていたら佐藤さんから耳寄りな情報が届
きました。

Subject: [namazu-dev 1603] Re: mknmz --quiet
From: SATOH Fumiyasu <fumiya@xxxxxxxxx>
| DOS / Windows (OS/2 も?) では、「nul」という名前のファイルは
| カーネルで(?)予約されていて、/dev/null みたいにブラックホールになります。
| 
| if ($var::Opt{'quiet'}) {
|     open(STDOUT, "nul");
| }
| 
| ActivePerl は先日消してしまって、手元には Windows NT 4.0 SP6a 上の
| Pler for Win32 Build 107 (perl 5.001) しかないのですが、これで試した
| 限りは大丈夫そうです。

ということは、

  $SYSTEM = $^O;
  if ($var::Opt{'quiet'}) {
      if (-e "/dev/null") {
	  open(STDOUT, ">/dev/null") || die "/dev/null: $!";
      } elsif (($SYSTEM eq "MSWin32") || ($SYSTEM eq "os2")) {
	  open(STDOUT, ">nul") || die "nul: $!";
      } else {
	  die "\"/dev/null\" or equivalent are needed to enable --quiet."
      }
  }

とすればよさそうです。どなたか Windows 上で次のスクリプトの
動作確認をしてもらえませんか?

  #! /usr/bin/perl -w
  use strict;

  print "foo\n";

  my $SYSTEM = $^O;
  if (-e "/dev/null") {
      open(STDOUT, ">/dev/null") || die "/dev/null: $!";
  } elsif (($SYSTEM eq "MSWin32") || ($SYSTEM eq "os2")) {
      open(STDOUT, ">nul") || die "nul: $!";
  } else {
      die "\"/dev/null\" or equivalent are needed to enable --quiet."
  }

  print "bar\n";   # 表示されてはいけない

-- Satoru Takabayashi