Perl中的系统,exec和反引号有什么区别?

时间:2009-09-04 04:26:15

标签: perl ipc

在Perl中,从我的脚本运行另一个Perl脚本,或运行任何系统命令,如mvcppkgaddpkgrm,{{1} },pkginfo等,我们可以使用以下内容:

  • rpm
  • system()
  • exec()(反问题)

这三者是否相同,或者它们是否不同?在这种情况下,三者都能得到相同的结果吗?它们是否用于不同的场景,比如调用我们必须使用``的Perl程序,而对于其他人我们必须使用system()(反引号)。

请告知,因为我目前正在使用``进行所有通话。

6 个答案:

答案 0 :(得分:12)

他们都不同,文档解释了他们的不同之处。反引号捕获并返回输出; system返回退出状态,exec如果成功则永远不会返回。

答案 1 :(得分:6)

IPC::System::Simple可能就是你想要的。

它为反引号,system()和其他IPC命令提供了安全,可移植的替代方案。

它还允许您为大多数所述命令避免使用shell,这在某些情况下会有所帮助。

答案 2 :(得分:3)

best 选项是使用标准库或CPAN中的某个模块来完成这项工作。它将更加便携,对于快速任务可能更快(不会分叉到系统)。

但是,如果这对你来说不够好,你可以使用其中的一个,不,它们不一样。阅读perldocsystem()exec()上的backticks页,了解其中的差异。

答案 3 :(得分:1)

调用system通常是个错误。例如,而不是说

system "mv $foo /tmp" == 0
    or die "could not move $foo to /tmp";

system "cp $foo /tmp" == 0
    or die "could not copy $foo to /tmp";

你应该说

use File::Copy;

move $foo, "/tmp"
    or die "could not move $foo to /tmp: $!";

copy $foo, "/tmp"
    or die "could not copy $foo to /tmp: $!";

CPAN上查找为您处理其他命令的模块。如果您发现自己写了很多对system的调用,可能是时候回到shell脚本了。

答案 4 :(得分:1)

嗯,回答的人越多。

我的回答是通常避免外部命令执行。如果可以 - 使用模块。没有必要执行“cp”,“mv”和许多其他命令 - 存在执行它的模块。使用模块的好处是它们通常可以跨平台工作。虽然您的系统(“mv”)可能没有。

当处于我没有其他办法的情况,但是为了调用外部命令,我更喜欢使用IPC::Run。这个想法是所有简单的方法(反引号,qx,系统,用管道打开)本质上是不安全的,需要注意参数。

使用IPC::Run,我运行的命令就像我使用系统(@array)一样,它更安全,我可以使用变量或回调单独绑定到stdin,stdout和stderr,这是非常很酷,因为您必须将数据从长时间运行的代码传递到外部程序。

此外,它还具有内置的超时处理功能,可以多次使用:)

答案 5 :(得分:-1)

如果您不希望shell参与(通常不参与),并且如果等待系统命令是可接受的,我建议使用IPC::Run3。它简单,灵活,执行程序,输入输入并正确捕获输出和错误流的常见任务。

相关问题