为什么命令在脚本中死亡但在脚本外部执行时却没有?

时间:2011-09-21 13:54:44

标签: perl

我在Windows 7上使用ActivePerl 5.12.4。我的脚本中有这个...

my $cmd = "ant -Dbuildtarget=$env -Dmodule=\"$module\" -Dproject=$project -Dnolabel=true checkout-selenium-tests";
print "cmd: $cmd\n"; 
open(F, $cmd) or die "Failed to execute: $!";
while (<F>) {
    print;
}

可悲的是,我的脚本在“open”命令中因故障而死:

Failed to execute: Invalid argument at run_single_folder.pl line 17.

我不知道出了什么问题。当我打印出执行的命令时,我可以在命令窗口中正常执行该命令,它运行正常。我怎么能弄清楚为什么在命令提示符下成功执行Perl脚本中的命令会死?

2 个答案:

答案 0 :(得分:4)

你需要告诉Perl它是一个使用“|”的管道。

open(my $PIPE, "foo |")   # Get output from foo

open(my $PIPE, "| foo")   # Send input to foo

由于你不需要shell,让我们避免它,但使用multi-arg版本。首先,它可以避免您将$env$module$project转换为shell文字(就像您尝试使用$module一样)。

my @cmd = (
   ant => (
      "-Dbuildtarget=$env",
      "-Dmodule=$module",
      "-Dproject=$project",
      "-Dnolabel=true",
      "checkout-selenium-tests",
   )
);

open(my $PIPE, '-|', @cmd) or die "Failed to execute: $!";
while (<$PIPE>) {
   print;
}

答案 1 :(得分:2)

如果要通过调用open()启动子进程并捕获其输出,则需要在命令后使用|,否则perl会认为您要打开文件。