【问题标题】:How to execute perl file from shell script如何从shell脚本执行perl文件
【发布时间】:2024-11-02 01:10:01
【问题描述】:

我有一个关于如何在 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 行:我的:找不到命令

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

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

【问题讨论】:

  • FILEPATH 是绝对路径还是相对路径?应该是绝对的
  • FILEPATH 应该是环境变量吗?如果是这样,那么它应该是$FILEPATH
  • 你说我有 2 个文件:test.sh 和 test.pl,那么 filename.pl 是什么?
  • 确定你的Perl脚本的第一行是#!/usr/bin/perl吗?如果您要向我们展示代码,最好复制并粘贴它;如果您重新输入,您可能会丢失重要信息。
  • 有什么方法可以让perl FILEPATH/test.pl 中的perl '丢失'。例如,您可能有${PERL-perl} 而不仅仅是perl(或更好的${PERL:-perl}),或者您有alias perl='' 或同样奇怪的东西?您看到的错误表明 shell 正在执行文件,而不是 Perl。我能看到的唯一方法是对代码进行一些隐藏的更改。

标签: perl shell


【解决方案1】:

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

#!/bin/sh

/somewhere/perlScript.pl

它将毫无问题地工作。

【讨论】:

  • 这假定脚本具有可执行权限和适当的 shebang。您应该正确解释这一点;但是,您的答案基本上是现有答案之一的副本。
  • 任何其他相同的想法。
【解决方案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";

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 那我该如何解决呢?以及为什么它可以在另一台机器上运行?
      • @user1672190:你确定你粘贴了实际的脚本吗?您确定将文件正确传输到远程计算机吗?两台机器上的环境有何不同?
      最近更新 更多