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

 .
 .
 . 

私の問題:

/etc/rc3.d/S99script.pl からの再起動後にスクリプト bbpinstaller.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 script には、次の 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 の PATH

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

理解するのを手伝ってください。ここで何が問題ですか??? (私はPerlの経験があまりありません)

4

3 に答える 3

2

/usr/local/ローカル インストールで使用されます (つまり、OS ベンダーから提供されたものではありません)。$PATH次に、 /usr/local/bin/perl (5.8.4) ではなく /usr/local/bin/perl (5.8.7)を実行するようにシェルをセットアップします。

ただし、init スクリプトはシェル設定では実行されません。システム設定を使用するため、このライブラリ ( ) がインストールされていない/usr/local/binOS 提供の perl が使用されます。/usr/bin/perlTerm::ReadKey

(拡張子 .pl は通常、perl プログラム用です。bash/shell スクリプトには .sh を使用します)

スクリプトを直接実行する場合 (つまり、コマンドラインで最初にインタープリターを指定しない場合)、カーネルは hash-bang 行 (最初の行) を使用して、スクリプトを解釈するために実行するプログラムを決定します。

たとえば、シェル スクリプト /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 が示唆するように、シェル スクリプトに PATH を設定します。
  3. MichaelN も示唆しているように、カーネルに決定させる代わりに、明示的な perl を呼び出します。
  4. /usr/local/bbp/api/bbpinstaller.plTerm/ReadKey を必要としないように再コーディング
于 2012-04-24T15:54:43.687 に答える
1

デフォルトでは、os perl は /usr/bin/perl であり、そのモジュールはすべて /usr/perl5/site_perl/5.8.4 /usr/perl5/site_perl にあります。rc3 経由でスクリプトを実行すると、ルートの標準パスと標準ライブラリが使用されるため、/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 を次のように変更します。

#!/ビン/バッシュ
export PATH=/usr/local/bin:${PATH}
/usr/local/bbp/api/bbpinstaller.pl

または、perl でスクリプトを呼び出します。

#!/ビン/バッシュ

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

于 2012-04-24T18:41:42.620 に答える
0

私は、あなたが求めた修正を提供するために、あなたの問題を分析する際に Douglas が行った作業を完全に無効にしています。

私は次のいずれかを行います:

  1. RC シェル スクリプトで、適切なバージョンの perl を実行するように PATH を設定してから、Perl スクリプトを呼び出します。
  2. Perl スクリプトの「shebang」行を変更して、適切なバージョンの Perl を使用します。

それらの1つが役立つことを願っています!

于 2012-04-24T18:08:44.370 に答える