我有一个关于如何在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),它可以很好地工作。
答案 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";
注意:我添加了行号,以便清楚地显示行的开始和结束位置。