在Perl中,从我的脚本运行另一个Perl脚本,或运行任何系统命令,如mv
,cp
,pkgadd
,pkgrm
,{{1} },pkginfo
等,我们可以使用以下内容:
rpm
system()
exec()
(反问题)这三者是否相同,或者它们是否不同?在这种情况下,三者都能得到相同的结果吗?它们是否用于不同的场景,比如调用我们必须使用``
的Perl程序,而对于其他人我们必须使用system()
(反引号)。
请告知,因为我目前正在使用``
进行所有通话。
答案 0 :(得分:12)
他们都不同,文档解释了他们的不同之处。反引号捕获并返回输出; system
返回退出状态,exec
如果成功则永远不会返回。
答案 1 :(得分:6)
IPC::System::Simple可能就是你想要的。
它为反引号,system()和其他IPC命令提供了安全,可移植的替代方案。
它还允许您为大多数所述命令避免使用shell,这在某些情况下会有所帮助。
答案 2 :(得分:3)
best 选项是使用标准库或CPAN中的某个模块来完成这项工作。它将更加便携,对于快速任务可能更快(不会分叉到系统)。
但是,如果这对你来说不够好,你可以使用其中的一个,不,它们不一样。阅读perldoc,system()
和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
。它简单,灵活,执行程序,输入输入并正确捕获输出和错误流的常见任务。