【问题标题】:Perl script not run system commandPerl 脚本不运行系统命令
【发布时间】:2013-06-12 08:25:16
【问题描述】:

我正在尝试运行 mplayer 系统命令以通过 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"`;

如果我在 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 脚本中不起作用

【问题讨论】:

    标签: perl command-line-arguments


    【解决方案1】:

    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: command : not found error output in perl script

    提到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";
    

    【讨论】:

    • 如果你尝试过这个,为什么你没有在问题中提到这个?你为什么不运行一个shell脚本?我真的看不出在这里使用 Perl 有什么好处...
    • 您从哪个变体获得sh: 1 信息?请注意,当以sh 运行时,bash 无法识别进程重定向。所以,你最终可能不得不强制 Perl 运行bash。我会更新答案...
    • sh: 1: /usr/bin/mplayer -nosound -benchmark -vo yuv4mpeg:file=>(/usr/local/bin/x264 --demuxer y4m --crf 24 --output output.h26 - 2>x264.log) input.mov: not found 在 perl 脚本中运行时出现此错误
    • 我的回答中有两个 Perl 脚本片段,你的问题中有两个;您没有指出其中哪一个会生成错误消息。现在我的答案中有三个 Perl 脚本片段。
    • 好;很高兴我们让您上路。
    猜你喜欢
    • 2014-03-18
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    相关资源
    最近更新 更多