8

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

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

外壳脚本

#!/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 行:我的:找不到命令

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

顺便说一句,如果我单独执行 perl 脚本(perl FILEPATH/FILENAME.pl),它可以完美运行。

4

4 回答 4

3

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

#!/bin/sh

/somewhere/perlScript.pl

它将毫无问题地工作。

于 2016-04-05T07:18:04.760 回答
2

这个问题至少有两个方面。一,你必须在你的环境 PATH 中有 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";

注意:我添加行号只是为了清楚行的开始和结束位置。

于 2017-09-26T19:41:32.813 回答
1

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

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

于 2013-04-16T02:33:52.830 回答
0

“找不到命令”是外壳程序发出的错误。您试图通过 shell 运行您的 Perl 脚本,而不是通过 Perl。

于 2013-04-15T22:50:28.870 回答