0

我需要关于以下方面的建议:

选项1

我从我的Linux机器的/var/tmp目录运行脚本/usr/local/bbp/api/bbpinstaller.pl,没有问题

选项 2

我在 /var/tmp 下创建新脚本 - script.pl

然后我创建从 /var/tmp/script.pl 到 /etc/rc3.d/S99script.pl 的链接(通过 ln -s )

所以 S99script.pl 链接到 /var/tmp/script.pl

和 script.pl 执行 /usr/local/bbp/api/bbpinstaller.pl

 more /etc/rc3.d/script.pl 


 #!/bin/bash 


 /usr/local/bbp/api/bbpinstaller.pl

 .
 .
 . 

我的问题

当脚本 bbpinstaller.pl 在从 /etc/rc3.d/S99script.pl 重新启动后运行时,我收到以下错误( /usr/local/bbp/api/bbpinstaller.pl 从 S99script.pl 运行)

     Can't locate Term/ReadKey.pm in @INC (@INC      contains: /etc/bbp/shared /usr/perl5/5.8.4/lib/sun4-solaris-     64int /usr/perl5/5.8.4/lib /usr/perl5/site_perl/5.8.4/sun4-
    solaris-    64int /usr/perl5/site_perl/5.8.4 /usr/perl5/site_perl /usr/perl5/vendor_perl/5.8.4/sun4-    solaris-64int /usr/perl5/vendor_perl/5.8.4 /usr/perl5/vendor_perl
    . ) at /usr/local/bbp/api/bbpinstaller.pl line 25.
     BEGIN failed--compilation aborted at /usr/local/bbp/api/bbpinstaller.pl line 25.

在 /usr/local/bbp/api/bbpinstaller.pl 脚本中,我有以下 perl 模块:

 #################################
 #       Modules imported
 #################################
 use Config;
 use Getopt::Long;
 use File::Find;
 use English;
 use Sys::Hostname;
 $File::Find::dont_use_nlink=1;
 use lib "/etc/bbp/shared";
 use Term::ReadKey qw(GetTerminalSize);
 use Cwd 'abs_path';
 require "bbp_globals.pl";
 require "bbp_functions.pl";

文件 ReadKey.pm 的路径

  /usr/local/lib/perl5/site_perl/5.8.7/sun4-solaris-thread-multi/Term/ReadKey.pm

请帮我理解。这里有什么问题???(我没有 Perl 的分配经验)

4

3 回答 3

2

/usr/local/由本地安装使用(即它不是由操作系统供应商提供的)。然后你的 shell 设置为运行 ( $PATH) /usr/local/bin/perl (5.8.7) 而不是 /usr/local/bin/perl (5.8.4)。

但是,init 脚本不会使用您的 shell 设置运行 - 它们使用系统设置,而这些设置不会包含/usr/local/bin在其中 - 因此它们将使用操作系统提供的 perl -/usr/bin/perl它没有安装此库 ( Term::ReadKey)。

(.pl 扩展名通常用于 perl 程序 - 我将 .sh 用于 bash/shell 脚本)

当您直接运行脚本时(即,不首先在命令行上指定解释器),内核使用 hash-bang 行(第一行)来确定要执行哪个程序来解释脚本。

例如,您的 shell 脚本 /etc/rc3.d/script.pl 有一个“”的散列线#!/bin/bash,告诉它用/bin/bash.

/usr/local/bbp/api/bbpinstaller.pl开头会有一个 hash-bang 行,可能是这样的:#!/usr/bin/env perl

这告诉内核/外壳查看PATH变量以找到解释器;perl如果您在命令行上键入它,它会以同样的方式找到它。

为了解决您的问题,或者:

  1. 将 Term/ReadKey 安装到系统 perl 中。
  2. 按照 MichaelN 的建议在 shell 脚本中设置 PATH。
  3. 正如 MichaelN 所建议的那样,调用显式 perl 而不是让内核决定。
  4. /usr/local/bbp/api/bbpinstaller.pl重新编码以不需要 Term/ ReadKey
于 2012-04-24T15:54:43.687 回答
1

默认情况下,操作系统 perl 是 /usr/bin/perl,它的所有模块都在 /usr/perl5/site_perl/5.8.4 /usr/perl5/site_perl 中。由于通过 rc3 运行脚本使用 root 的标准路径和标准库,它不会在 /usr/local/bin 中找到您的自定义 perl,因此不会在 /usr/local/lib 中找到您的站点库。所以你需要修改你的调用脚本“/etc/rc3.d/script.pl”,它是一个bash脚本(应该可能是调用script.sh,但那是语义)在路径中包含/usr/local/bin,即: 导出 PATH=/usr/local/bin:${PATH}。这会将 /usr/local/bin 预先附加到 PATH 的前面,然后将调用 /usr/local/bin 中的 perl 而不是 /usr/bin/perl。因此将 script.pl 更改为:

#!/bin/bash
导出 PATH=/usr/local/bin:${PATH}
/usr/local/bbp/api/bbpinstaller.pl

或者用你的 perl 调用你的脚本。

#!/bin/bash

/usr/local/bin/perl /usr/local/bbp/api/bbpinstaller.pl

于 2012-04-24T18:41:42.620 回答
0

为了提供您要求的修复,我完全关闭了 Douglas 在分析您的问题时所做的工作。

我会:

  1. 在 RC shell 脚本中,设置您的 PATH 以运行正确版本的 perl,然后调用您的 Perl 脚本。
  2. 更改 Perl 脚本中的“shebang”行以使用正确版本的 Perl。

希望其中之一有帮助!

于 2012-04-24T18:08:44.370 回答