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);'
としては、私はバイナリのパスを格納するための構文を決定しようとしている識別することができ
オプションでそのバイナリへのシステムコールを実行します。私は正しい構文の啓蒙に感謝します。
ありがとうございます。 – user001
ありがとうございました。私は、one-linersのために 'use warnings; 'の' -w'オプションについて知らなかった。私は常にそれをスクリプトに含める。 – user001
'-w'は、スイッチオン警告の古い方法ですが、それでもサポートされています。 'use warnings;'(5.6で導入されました)は、制御可能でより明示的であるため、スクリプトでは優先されます。 – cdarke