Perl脚本不运行系统命令

时间:2013-06-16 02:27:55

标签: perl command-line-arguments

我正在尝试通过Perl脚本运行mplayer system命令来编码视频但不能正常工作

#!/usr/bin/perl
`"/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov"`;

如果我在ssh终端上运行

/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov

命令在ssh终端上工作不在perl脚本中工作

1 个答案:

答案 0 :(得分:4)

Perl脚本中有太多引号。咬牙疼,我想你可以这样做:

#!/usr/bin/perl
`/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov`;

哦;你在那里有一个bash进程重定向。这使问题复杂化;你不能简单地将命令拆分为:

#!/usr/bin/perl
my $x264 = "/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log";
exec "/usr/bin/mplayer", "-nosound", "-benchmark", "-vo",
      "yuv4mpeg:file=>($x264)",
      "input.mov";

这通常是最好的方式;这对你不正确。

你可能还有更好的使用方法:

#!/usr/bin/perl
system "/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov";

因为你真的对命令的输出不感兴趣。 OTOH,没有理由像这样使用Perl。最好写一下:

#!/usr/bin/bash
/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov

在命令之前可选择exec

#!/usr/bin/bash
exec /usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov

有关请求漏出的原因和原因的信息,我们观察:

  

sh:1:命令:在perl脚本中找不到错误输出

提及sh表示问题的一部分。当bash作为sh运行时,它不支持进程替换。鉴于这是一个更大的Perl脚本的一个片段,我们将继续努力从Perl运行命令。

#!/usr/bin/perl
use strict;
use warnings;

my $x264 = "/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log";
system "bash", "-c",
       "/usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>($x264) input.mov";