我在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脚本中的命令会死?
答案 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会认为您要打开文件。