Windows XP で Cygwin Perl を使用しています。
>nul 2>&1
Perl の Batch に相当するものはありますか?
こちらを参照してください。
シェル コマンドがある場合:
system("$cmd >nul 2>&1");
die $! if $? < 0;
die "Child killed by signal ".($? & 0x7F)."\n" if $? & 0x7F;
die "Child exited with error ".($? >> 8)."\n" if $? >> 8;
プログラムと引数がある場合:
use IPC::Open3 qw( open3 );
open(local *CHILD_STDIN, '<', 'nul') or die $!;
open(local *CHILD_STDOUT, '>', 'nul') or die $!;
my $pid = open3(
'<&CHILD_STDIN',
'>&CHILD_STDOUT',
undef, # 2>&1
$prog, @args,
);
waitpid($pid, 0);
die $! if $? < 0;
die "Child killed by signal ".($? & 0x7F)."\n" if $? & 0x7F;
die "Child exited with error ".($? >> 8)."\n" if $? >> 8;
注: 子の起動中にエラーが発生した場合は終了します。
Cygwin は Unix のように動作し、null デバイスは/dev/null
ではなく名前が付けられますnul
。外部コマンドを実行し、すべての出力をスケルチすると、
system("mycommand arg1 arg2 >/dev/null 2>&1") == 0
or warn "$0: mycommand exited $?";
シェルの解析をバイパスするには、リダイレクトも自分で実行する必要がありますか?
use POSIX '_exit'; # if not available, fall back to plain exit with caveats
my $pid = fork;
die "$0: fork: $!" unless defined $pid;
if ($pid) {
if (waitpid $pid, 0 >= 0) {
my $status = $? >> 8;
if ($status == 13) {
warn "$0: error starting mycommand";
}
else {
warn "$0: mycommand exited $status";
}
}
else {
warn "$0: waitpid: $!";
}
}
else {
open STDOUT, ">", "/dev/null" or warn("$0: open: $!"), _exit 13;
open STDERR, ">&", \*STDOUT or _exit 13;
exec "mycommand", "arg1", "arg2" or _exit 13;
}
前の質問への回答で書いたように、あなたが望むのは
system('cmd /C', $exe, @parm, '1>nul', '2>nul');