-1

複数の引数が perl のシステム関数に渡された場合、シェル展開は機能しません:

# COMMAND
$ perl -e 'my $s="*"; system("echo", "$s" )'

# RESULT
*

コマンドが 1 つの引数として渡された場合、展開は機能します。

# COMMAND
$ perl -e 'my $s="echo *"; system("$s")'

# RESULT
Desktop Documents Downloads

システム機能では、複数のコマンドを使用し、パイプを使用してそれらを接続することもできます。これは、引数が 1 つのコマンドとして渡された場合にのみ機能します。

# COMMAND
$ perl -e 'my $s="echo * | cat -n"; system("$s")'

# RESULT
1 Desktop Documents Downloads

上記のコマンドを組み合わせて両方のパイプを使用し、シェルの拡張を防ぐにはどうすればよいですか?

私が試してみました:

# COMMAND
$ perl -e 'my $s="echo"; system("$s", "* | cat -n")'

# RESULT
* | cat -n

しかし、これは上で説明した理由により機能しませんでした (複数の引数は展開されません)。私が望む結果は次のとおりです。

1 *

編集:私が実際に直面している問題は、次のコマンドを使用する場合です:

system("echo \"$email_message\" | mailx -s \"$email_subject\" $recipient");

次に、$email_message が展開され、シェルによってさらに展開される文字が含まれていると、mailx が壊れます。

4

2 に答える 2

3

openシェルによってコンテンツが解釈されることなく、mailx に直接パイプするために使用できます。

open( my $mail, "|-", "mailx", "-s", $email_subject, $recipient );
say $mail $email_message;
close $mail;

詳細はperlipcのオープンセクションにあります。

于 2015-04-12T22:25:54.087 に答える