2017-01-09 5 views
0

Perlでシステムバイナリを実行するための正しい構文を見つけるのが難しいです。パスがperlの変数に格納されているシステムバイナリにコマンドオプションを指定する

予想通り、次の作品:

perl -e 'system(ls);' 

引用符は、バイナリのパスを中心に供給されていない限り、次は動作しません:

perl -e 'system(/bin/ls);' 

documentationの私の理解を考えると、両方のケースでは、 systemの引数はshell metacharactersのない単一のスカラーなので、結果は同じでなければなりません。さらに、perlコマンドは一重引用符で囲まれているため、シェル補間は問題として排除できます。

オプションは、短い名前または完全パスのいずれかを利用して、種々の手段によってコマンドに供給することができる。

perl -e 'system("ls", "-l");' 
perl -e 'my @args = ("ls","-l"); system(@args);' 
perl -e 'my @args = ("/bin/ls","-l"); system(@args);' 

バイナリパスを変数に格納されている場合は、オプションが失敗:

perl -e 'my $ls = `which ls`; system($ls, "-l");' 
perl -e 'my $ls = `which ls`; system("$ls", "-l");' 
perl -e 'my $ls = `which ls`; my @args = ($ls,"-l"); system(@args);' 
perl -e 'my $ls = `which ls`; my @args = ("$ls","-l"); system(@args);' 

変数内のバイナリのパスを保存するオプションが省略されていれば許容される。

perl -e 'my $ls = `which ls`; system($ls);' 
一方

、オプションはバイナリの名前を含む変数を使用することができます。

perl -e 'my $ls = "ls"; my @args = ($ls,"-l"); system(@args);' 
としては、私はバイナリのパスを格納するための構文を決定しようとしている識別することができ

オプションでそのバイナリへのシステムコールを実行します。私は正しい構文の啓蒙に感謝します。

答えて

1

OK、答えはwhichを削除する必要がありますバイナリのパスに改行を追加していること単にだった:

$ perl -e 'my $ls = `which ls`; chomp($ls); system("$ls", "-l");' 

ではなく投稿を削除、私はの利益のためにそれをここに残しておきます同じ問題に直面する将来のユーザー

質問の冒頭で述べたように、 "/ bin/ls"ではなく "ls"の前後で引用符が必要なのはなぜか分かります。

1

引用符で囲む必要があり理由:

perl -e 'system(/bin/ls);' 

は裸/は、正規表現の開始と見られているためである、とマッチ演算子m)デフォルト。 perlopとして言う:

メートル/ PATTERN/msixpogc

/PATTERN/msixpogc

パターンマッチのために、とスカラーコンテキストで文字列を検索し、それが成功した場合、それが失敗した場合はfalse、trueを返します。 =〜または!〜演算子で文字列が指定されていない場合は、$ _文字列が検索されます。

しかし、私はあなたに聞いて聞いて、なぜそれは警告をスローしなかったのですか?警告を設定していないため、

perl -we 'system(/bin/ls);' 
Use of uninitialized value $_ in pattern match (m//) at -e line 1. 
+0

ありがとうございます。 – user001

+0

ありがとうございました。私は、one-linersのために 'use warnings; 'の' -w'オプションについて知らなかった。私は常にそれをスクリプトに含める。 – user001

+0

'-w'は、スイッチオン警告の古い方法ですが、それでもサポートされています。 'use warnings;'(5.6で導入されました)は、制御可能でより明示的であるため、スクリプトでは優先されます。 – cdarke

関連する問題