2

ファイルを取得するための csh コマンドがコマンド ラインからは正常に機能するのに、Perl スクリプトに組み込むと機能しない理由を理解するのに少し苦労しています。

  my @envvar = ();
  if (-e $ENV{WSDIR}."/<script>.csh") {
    @envvar = `csh -c "cd $WSDIR ; source <script>.csh  ; env"`;
  }

Perl スクリプトを実行すると、script.csh: No such file or directoryのようなエラーが表示されますが、ターミナルから csh コマンドとして実行すると期待どおりに動作します。Perl 内の csh コマンドで環境変数を使用する際の制限は何ですか? どうすればこの問題を克服できますか。

4

2 に答える 2

6

$WSDIRによって空の文字列に補間されていますperl。必要に応じて展開できるシェルに送信されるように、「$」をエスケープする必要があり$WSCIRます。

@envvar = `csh -c "cd \$WSDIR ; source <script>.csh  ; env"`;

または、perl に環境変数自体を展開させることもできます:

@envvar = `csh -c "cd $ENV{WSDIR} ; source <script>.csh  ; env"`;
于 2013-02-27T15:50:42.063 に答える
1

perl が起動すると、独自のサブシェルが作成されます。そのサブシェルには、メインシェルでのみ利用可能なシェルファイルのソースなどのすべての機能が含まれているわけではありません。

Shell::SourceであるCPANから外部モジュールをインストールすることでこれを行うことができます

$env_path= Shell::Source->new(shell=>"tcsh",file=>"../path/to/file/<script>.csh");
$env_path->inherit;
print "Your env path: $ENV{WSDIR}";

perl はシェル上で実行中に独自のインスタンスを作成するため、perl のインスタンスはメイン シェルのサブ シェルのようになるため、メイン シェルの環境パスを設定することはできません。子は親の環境パスを設定できません。

perl のサブシェルが実行されるまで、.csh にあるすべてのパスにアクセスできます。

于 2013-07-10T05:21:43.320 に答える