如何从shell脚本中执行perl文件

9

我是一名能翻译文字的助手。

我有一个关于如何在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: line 2: my: command not found
有人知道如何解决这个问题吗?
顺便说一句,如果我单独执行perl脚本(perl FILEPATH/FILENAME.pl),它可以完美地工作。

FILEPATH是绝对路径还是相对路径?应该是绝对路径。 - chrsblck
FILEPATH 应该是一个环境变量吗?如果是,那么它应该是 $FILEPATH - Brigham
1
你说我有两个文件:test.sh和test.pl,那么filename.pl是什么? - Diego Torres Milano
2
你确定你的Perl脚本的第一行是#!/usr/bin/perl吗?如果你要展示代码,最好的方法是复制粘贴;如果你重新打字,你可能会丢失重要信息。 - Keith Thompson
1
有没有可能在 perl FILEPATH/test.pl 中丢失 perl 的方式。 例如,您可能会使用${PERL-perl}而不是仅仅使用perl(或更好的${PERL:-perl}),或者您可能会使用alias perl =''或类似怪异的内容?您看到的错误表明shell正在执行文件,而不是Perl。而我能想到的唯一可能性就是代码中存在一些隐藏的更改。 - Jonathan Leffler
显示剩余5条评论
4个回答

4
为了通过.sh脚本执行perl脚本,您不需要使用perl前缀,只需要:
#!/bin/sh

/somewhere/perlScript.pl

它可以正常工作,没有问题。


6
这意味着脚本需要可执行权限和正确的shebang。你需要对此进行适当的解释;但是这样做会与现有答案之一基本重复。 - tripleee
有没有其他相同的想法? - Shubham Sharma

2
这个问题至少有两个方面。首先,你必须在环境PATH中拥有Perl的位置。其次,不同机器上Perl的位置可能不同。我和其他人多年来一直使用的解决这两个问题的方法是,在Perl程序顶部使用某种“神奇头文件(magic header)”。该头文件将自己标识为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";

注意:我添加了行号,只是为了清楚起见,以便确定行的开始和结束位置。

1

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

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


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

3
那我该怎么修复它?还有,为什么它在另一台机器上可以工作? - user1672190
@user1672190:你确定你粘贴的是实际脚本吗?你确定你已经正确地把文件传输到远程机器上了吗?这两台机器的环境有什么不同吗? - choroba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接