/ /シェルコマンドでperl変数を補間する-perl

シェルコマンドでperl変数を補間する-perl

ユーザーからの入力として日付を取得し、その入力を以下のシェルコマンドに渡します。

例えば、

$date = ARGV[0];
`cd xyz $date`

この変数はperlで補間されますか?

回答:

回答№1は8

これはテストするのは簡単です:

入力:

use v5.16;
use strict;
use warnings;
my $foo = 123;
say `echo $foo`;

出力:

123

あ、はい。

ただし、シェルでは特別な意味を持つ文字を含む変数に注意してください。


回答№2の10

いくつか問題があります。まず第一に、 cd パラメータは1つだけです。おそらくあなたは cd xyz$date?第二に、バックティックは実行するシェルを開始します指定したコマンド。ディレクトリの変更コマンドを実行し、すぐに終了しますが、効果はありません。 (親perlプロセスの現在のディレクトリは変更されません。)探しているかもしれません chdir.

しかし、はい、補間は機能します。バックティックで補間を無効にするには、特殊文字(echo xyz $date)または単一引用符区切り文字付きのqxを使用します(qx"echo xyz $date")。


回答№3の6

Perldoc 相変わらず答えがあります。

具体的には、 http://perldoc.perl.org/perlop.html#Quote-and-Quote-like-Operators 補間に「はい」がありますか?列(ただし、ここで心配する必要はありません)なので、変数が補間されると仮定しても安全です。

多くの場合、ローカルコマンドラインで「perldoc perlop」を実行すると、同じドキュメントを取得できます。


答え№4のための5

はい、変数を補間します。ただし、次の2つのことを強くお勧めします。

  • つかいます qx/../ バックティックの代わりに。
  • 最初に実行しているコマンドをPerl変数に設定してから、その変数を補間します。

qx/../ 何をしているのかがより明確になるのでいいです。

my $variable = qx(ls $directory);

さまざまな文字を使用できます qx

my $variable = qx(ls $directory);
my $variable = qx/ls $directory/;
my $variable = qx^ls $directory^;
my $variable = qx#ls $directory#;

後の文字 qx として使用されます 引用符。かっこ、角かっこ、または中かっこを使用する場合は、開きかっこと閉じかっこを組み合わせて使用​​します。

これは、コマンドの特定の文字が物事を混乱させる問題を回避できることを意味します。

もう1つは、コマンドをPerl変数に組み込み、補間を行うときにコマンドを実行することです。これにより、実行している操作をより詳細に制御できます。

my $HOME;
my $command;

$HOME = "bin";
$command = "ls $HOME";
print qx($command); #Lists the directory bin

$command = "ls $HOME";
print qx($command); #List user"s home directory

これらの例の両方で、私はやっている qx($command)。ただし、最初の例では、Perlの値を $HOME. In the second example, I use single quotes, so Perl doesn"t substitute the value of$ HOME. Instead, the string$ HOME`は、使用しているコマンドの一部です。シェルに補間させます。

私は通常、 qx/.../。ほとんどの場合、「Perl自体で実行できるコマンドを実行するために使用されます。たとえば、初期のPerlプログラムでは、次のように表示されます」:

 $date = `date +%M/%Y/%D`
chop $date;     #Yeah, I said EARLY Perl programs

なぜなら、Unixコマンドを純粋なPerlの方法で実行しようとするよりも、単に実行する方がずっと簡単だったからです。ただし、Perlで実行する(つまり、 正しい)方法とは、「OSの動作にもはや依存していない」ことを意味します。

Perlスクリプトで使用するコマンドの出力が必要な場合は、使用する必要があります 開いた コマンドを実行し、コマンドの出力をファイルとして扱います。

my $command = "ls $HOME";
open my command_fh, "|-", $command or die qq(Couldn"t execute "$command");

単にコマンドを実行する必要がある場合は、 システム コマンド:

my $command = "xyz $date";
my $error = system $command;
if ( $error ) {
#Something terrible happened...
}

単一のスカラー引数のみを送信する場合、 system コマンド、 そして 可能なシェルメタ文字が含まれている場合、OSシェルを介してコマンドを実行します。あなたが送る場合 system 実行するリストを命令する、 または シェルメタキャラクターはありません。Perlはコマンドエグゼキューターを呼び出して、シェル補間なしでコマンドを直接実行します。

my @command = qw(ls $HOME);
system @command;   #Will print out "No such directory "$HOME"