system
具有三种调用约定:
system($SHELL_CMD)
system($PROG, @ARGS) # @ARGS>0
system( { $PROG } $NAME, @ARGS ) # @ARGS>=0
第一个将命令传递给 shell。它相当于
system('/bin/sh', '-c', $SHELL_CMD)
另外两个执行程序$PROG
. system
永远不会阻止 shell 扩展或执行任何转义。根本不涉及外壳。
所以你的问题是关于构建 shell 命令。如果出现提示,您可以使用
echo \* | cat -n
or
echo '*' | cat -n
to pass *
。您需要一个执行转义工作的函数*
在插值之前。幸运的是,已经存在一个:字符串::ShellQuote http://search.cpan.org/perldoc?String::ShellQuote's shell_quote
.
$ perl -e'
use String::ShellQuote qw( shell_quote );
my $s = "*";
my $cmd1 = shell_quote("printf", q{%s\n}, $s);
my $cmd2 = "cat -n";
my $cmd = "$cmd1 | $cmd2";
print("Executing <<$cmd>>\n");
system($cmd);
'
Executing <<printf '%s\n' '*' | cat -n>>
1 *
I used printf
代替echo
因为很难处理从以下开始的争论-
in echo
。大多数程序接受--
将选项与非选项分开,但不是我的echo
.
所有这些复杂问题都引出了一个问题:你为什么要花钱发送电子邮件?处理来自外部程序的错误通常比处理来自库的错误要困难得多。