複数の引数が 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 が壊れます。