Perl 了解'不同用法的差异;系统&x27;

Perl 了解'不同用法的差异;系统&x27;,perl,Perl,系统的这两种用法有何不同 $cmd = "/my/code.pl"; $status = system("$cmd $var1"); vs 后者更好(在大多数情况下),因为它将每个单独的参数作为单个命令行参数显式地传递给指定的命令 在前一个版本中,$cmd或$var1中存在的任何空格都会导致发送额外的(可能是不需要的)命令行参数 举个例子,给定$cmd=“cat”和$var1=“/tmp/my test file”第一行将导致: cat /tmp/my test file # three p

系统的这两种用法有何不同

$cmd = "/my/code.pl";
$status = system("$cmd $var1");
vs

后者更好(在大多数情况下),因为它将每个单独的参数作为单个命令行参数显式地传递给指定的命令

在前一个版本中,
$cmd
$var1
中存在的任何空格都会导致发送额外的(可能是不需要的)命令行参数

举个例子,给定
$cmd=“cat”
$var1=“/tmp/my test file”
第一行将导致:

cat /tmp/my test file  # three parameters
第二个将给出:

cat "/tmp/my test file"  # one parameter
因此,第一个版本将文件名一分为二(可能会产生“未找到文件”错误),但第二个版本将保持
$var1
作为单个参数的完整性

但是,如果您需要重定向命令的输出(例如,
1>日志文件2>&1
)或shell的其他功能(球形、管道等),则需要使用第一个版本。

来自:

请注意,参数处理因参数数量而异。如果列表中有多个参数,或者列表是一个具有多个值的数组,则使用列表其余部分提供的参数启动列表第一个元素提供的程序。如果只有一个标量参数,将检查该参数是否有shell元字符,如果有,则将整个参数传递给系统的命令shell进行解析(在Unix平台上为/bin/sh-c,但在其他平台上有所不同)。如果参数中没有shell元字符,则会将其拆分为单词并直接传递给execvp,这样效率更高

这意味着如果您需要一个shell(例如,您将使用管道
,例如
/someprog | wc
),您需要使用示例中的第一个方法。

的第一个(一个字符串)调用运行系统shell来运行命令,并且(除其他外)意味着命令的参数(从
$var1
)将进行外壳扩展


具有多个参数的第二个版本绕过系统外壳,并且参数不进行进一步的外壳处理。这通常是推荐的操作方式。但是,请注意,这意味着您必须担心I/O重定向。如果这是一个问题,则使用第一种形式(小心使用)更简单。或者,探索CPAN以找到需要帮助的模块-肯定会有一些。

什么是
$var1
?确保
使用严格的
使用警告
。顺便说一句,
系统中的所有引号($cmd“,“$var1”)
是无用的。另一个区别是第二个有无用的引号,它应该是$status=system($cmd,$var1):-)你说的是正确的,但是
echo
示例是一个不好的例子。。。无论哪种方式都有效。如果我有$status=system(“$cmd$var1$var2”);第二种选择会是什么样子?@BrianRoach是的,我就是这么说的@阿尔尼塔克-对不起,一定错过了。
cat "/tmp/my test file"  # one parameter