2

Windows XP で Cygwin Perl を使用しています。

>nul 2>&1Perl の Batch に相当するものはありますか?

こちらを参照してください。

4

3 に答える 3

3

シェル コマンドがある場合:

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;

注: 子の起動中にエラーが発生した場合は終了します。

于 2013-02-27T13:07:39.407 に答える
1

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;
}
于 2013-02-27T15:36:53.053 に答える
0

前の質問への回答で書いたように、あなたが望むのは

system('cmd /C', $exe, @parm, '1>nul', '2>nul');
于 2013-02-27T13:43:52.797 に答える