理解“系统”不同用法的差异

时间:2012-01-12 23:31:32

标签: perl

system的这两种用法有什么区别?

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

VS

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

3 个答案:

答案 0 :(得分:5)

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

带有多个参数的第二个版本绕过系统shell,参数不再进行shell处理。这通常是推荐的做事方式。但请注意,这意味着您必须担心I / O重定向。如果这是一个问题,那么第一个表格(小心使用)会更简单。或者,探索CPAN以找到需要帮助的模块 - 必然会有一些。

答案 1 :(得分:4)

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

在以前的版本中,$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> logfile 2>&1)或shell的其他功能(通配符,管道等),那么您需要使用第一个版本。

答案 2 :(得分:2)

来自:http://perldoc.perl.org/functions/system.html

  

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

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