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