如果将多个参数传递给 perl 的系统函数,那么 shell 扩展将不起作用:
# COMMAND
$ perl -e 'my $s="*"; system("echo", "$s" )'
# RESULT
*
如果命令作为一个参数传递,则扩展将起作用:
# COMMAND
$ perl -e 'my $s="echo *"; system("$s")'
# RESULT
Desktop Documents Downloads
系统功能还允许使用多个命令并使用管道连接它们。这仅在参数作为一个命令传递时才有效:
# 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 被扩展,如果它包含一些由 shell 进一步扩展的字符,它将破坏 mailx。