如何从shell脚本执行perl文件

时间:2013-04-15 22:34:17

标签: perl shell

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

我现在有2个文件,“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 个答案:

答案 0 :(得分:3)

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

#!/bin/sh

/somewhere/perlScript.pl

它没有问题。

答案 1 :(得分:1)

“command not found”是shell发出的错误。您正在尝试通过shell运行Perl脚本,而不是Perl。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

这个问题至少是双重的。一,您必须在您的环境路径中拥有Perl的位置。二,Perl的位置可能在不同的机器上有所不同。我和其他人多年来使用的两个问题的一个解决方案是在Perl程序的顶部使用某种“魔术头”。标头将自己标识为sh shell脚本,并利用/ bin / sh存在于Linux / UNIX的每个版本/风格中的事实。标题的工作是用各种可能的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";

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

相关问题