首页 文章

如何从shell脚本执行perl文件

提问于
浏览
6

我有一个关于如何在shell脚本中执行perl文件的问题

我现在有两个文件,“test.sh”和“test.pl”,这里是我的脚本示例

SHELL脚本

#!/bin/bash
perl FILEPATH/test.pl
......

PERL脚本

#!/usr/bin/perl
my $a = "hello"
sub saysomething
{
    print $a;
}
.....

我调用shell脚本的方式是:在shell脚本的路径下,执行“./test.sh”

上面提到的都是在GUN bash环境下工作,版本4.2.24(1)-release(i686-pc-linux-gnu)perl(v5.14.2)

但是,如果我把这些脚本放在服务器上(我无法更改bash / perl版本)GNU bash,版本4.2.10(1)-release(x86_64-pc-linux-gnu)perl(v5.12.4),我得到了以下信息:

FILEPATH / test.pl:第2行:my:命令未找到

有谁知道我该如何解决这个问题?

顺便说一句,如果我单独执行perl脚本(perl FILEPATH / FILENAME.pl),它可以很好地工作 .

4 回答

  • 1

    为了通过.sh脚本执行perl脚本,您不需要使用perl前缀,但仅限于:

    #!/bin/sh
    
    /somewhere/perlScript.pl
    

    它会毫无问题地工作 .

  • 2

    “未找到命令”是shell发出的错误 . 您正在尝试通过shell运行Perl脚本,而不是通过Perl运行 .

  • 1

    首先检查系统上安装perl的位置,例如 which perl 并在shebang行中使用该位置而不是 /usr/bin/perl ,如果它不同的话 .

    如果所有其他建议都失败,请通过执行以下操作检查计算机上未正常运行的脚本的第一行: head -1 test.pl | xxd . 输出是否将最后两个字节显示为 0d 0a ?如果是这样,您可能通过Windows复制了文件,并且没有进行dos2unix转换 .

  • 1

    这个问题至少是双重的 . 一,您必须在您的环境PATH中拥有Perl的位置 . 二,Perl的位置可能在不同的机器上有所不同 . 我和其他人多年来使用的两个问题的一个解决方案是在Perl程序的顶部使用某种类型的“魔术头” . 标头将自身标识为sh shell脚本,并利用/ bin / sh存在于Linux / UNIX的每个版本/风格中的事实 . Headers 的工作是用各种可能的Perl位置强化PATH,然后运行Perl脚本代替它自己(通过exec) . 这是一个“Hello World”示例:

    1  #! /bin/sh --
    2  eval '(exit $?0)' && eval 'PERL_BADLANG=x;PATH="/usr/bin:/bin:/usr/local/bin:$PATH";export PERL_BADLANG;: \
    3  ;exec perl -x -S -- "$0" ${1+"$@"};#'if 0;
    4  exec 'setenv PERL_BADLANG x;exec perl -x -S -- "$0" $argv:q;#'.q
    5  #!/bin/perl -w
    6  +($0=~/(.*)/s);do(index($1,"/")<0?"./$1":$1);die$@if$@;__END__+if 0;
    7  # Above is magic header ... real Perl code begins here
    8  use strict;
    9  use warnings;
    10 print "hello world!\n";
    

    注意:我添加了行号,以便清楚地显示行的开始和结束位置 .

相关问题