2017-05-25 4 views
2

私はPerlプログラム内からBashコマンドを実行しようとしています。 しかし、PerlはBash $ PWD環境変数をPerl変数と混同しているようです。Perlスクリプト内のBash環境変数を使用していますか?

どうすれば文字列として読み込むことができますか?

これは私が

my $path = /first/path; 
`ln -s $path $PWD/second/path` 

これらのバッククォートを実行しようとしているものですがバッシュの2行目が実行されます。 System()を使用すると同じ問題が発生します。

アイデア?

+2

'PWD' *はbash(そして' zsh'のような他のシェル)によって*エクスポートされます。それを確認するには '/ usr/bin/printenv'を使います。 *魔法*環境変数 –

+0

@BasileStarynkevitch、私は訂正しました。 –

+2

'$ $ 'をエスケープするために' \ $ 'を使用してください。 – Arkadiy

答えて

5

ここでは、Bash変数の使用と外部コマンドの実行に2つのクエリがあります。

Perlで%ENV hashは、物事がASスクリプトまたは変更のために微妙に異なる意味を有することができるように、環境変数を

perl -wE'say $ENV{PWD}' 

は、しかし、あなたは、多くの場合、スクリプト内で同等になったほうが良いです、ありますスクリプトが実行されます。

さらに重要なことに、シェルコマンドを使用すると、クォート、シェルインジェクション、および解釈に関するあらゆる種類の潜在的な問題が発生します。たとえば、あなたが表示するコマンドは、Charles Duffyのコメントに記載されているように、危険です。原則として、Perlの豊富な機能を使う方が良いです。例

を参照してください。あなたが外部コマンドを実行する必要がない場合には


、それはsystemの多引数の形式を使用することにより、たとえば、完全にシェルを避けるのがベストです。コマンドの出力が必要な場合は、それを提供するPerlのさまざまなモジュールがあります。以下のリンクを参照してください。

シェルの機能を使用する必要がある場合は、シェルが必要なものを受け取れるようにすべてをちょうど引用する代わりに、String::ShellQuoteのような準備ツールを使用してください。

いくつかの例:

注意。あなたがBashを望むなら、system('/bin/bash', '-c', @cmd)が必要です。例とのリンクを参照してください。


ここでは、質問の背後にある目的に関する完全な例を示します。

プログラムの作業ディレクトリは、起動方法によっては予想外になる場合があります。 1つは、chdirの後に変更されます。私はPWDであなたの正確な意図は分かりませんが、PerlでコアCwd :: cwdFindBin :: $RealBinがあります。パスは、スクリプトの場所がFindBin::$RealBinの代わりcwd使用することを意図されている場合は

は、現在の作業ディレクトリ

use warnings; 
use strict; 
use Cwd qw(cwd); 

my $cwd = cwd; 

my $path = '/first/path'; 

symlink($path, "$cwd/second/path") or die "Can't make a symlink: $!"; 

次の相対パスで、$pathへのシンボリックリンクを作成します。

symlinkでは、リンク名の代わりにディレクトリを渡すことはできません。 this pageを参照してください。

+0

@RyanSaffer投稿をかなり更新し、具体的な回答を得ました。 – zdim

+0

期限切れの返信が、これは私を助けてくれました!ありがとう!! –

+0

@RyanSaffer Great :)もっと詳しい説明があれば教えてください。 – zdim

関連する問題