【问题标题】:Equivalent of >nul 2>&1 (from Batch) in Perl?Perl 中 >nul 2>&1 的等价物?
【发布时间】:2013-02-27 13:02:30
【问题描述】:

我在 Windows XP 上使用 Cygwin Perl。

Perl 中是否有相当于>nul 2>&1 的 Batch?

请参考Here

【问题讨论】:

  • 请举例说明您希望达到的目标
  • 那个链接的问题完全不同。 (如果他们不应该是,你为什么要发布两个应该相同的问题?)
  • @ikegami - 感谢您的更正。

标签: perl batch-file cygwin io-redirection


【解决方案1】:

如果你有一个 shell 命令:

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;

注意:如果启动子进程出错,则会死亡。

【讨论】:

    【解决方案2】:

    Cygwin 的工作方式与 Unix 类似,其中空设备被命名为 /dev/null 而不是 nul。运行外部命令并压制所有输出是

    system("mycommand arg1 arg2 >/dev/null 2>&1") == 0
        or warn "$0: mycommand exited $?";
    

    要绕过shell解析,是否还需要自己执行重定向。

    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;
    }
    

    【讨论】:

    • 您的第二个 sn-p 错误地将执行命令的错误报告为命令返回的错误。它还调用了它不应该调用的析构函数,因为使用了exit 而不是_exitopen3 不会遇到这些问题。它的使用时间也更短。
    【解决方案3】:

    正如我在回复您的previous question 时所写,您想要的是

    system('cmd /C', $exe, @parm, '1>nul', '2>nul');
    

    【讨论】:

    • 根据system 的文档,这相当于"cmd /C" "exe" "parm1" "1&gt;nul" "2&gt;nul",这在很多层面上都是错误的。但是,system 在 Windows 中的行为不像文档,因此它确实有效。
    猜你喜欢
    • 2021-02-17
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2016-04-19
    相关资源
    最近更新 更多