使用Perl的`系统`
我想运行一些命令(如command
)使用Perl的system()
。 假设command
是这样从shell运行的:
command --arg1=arg1 --arg2=arg2 -arg3 -arg4
如何使用system()
来运行带有这些参数的command
?
最佳实践:避免使用shell,使用自动error handling – IPC::System::Simple
。
require IPC::System::Simple; use autodie qw(:all); system qw(command --arg1=arg1 --arg2=arg2 -arg3 -arg4);
use IPC::System::Simple qw(runx); runx [0], qw(command --arg1=arg1 --arg2=arg2 -arg3 -arg4); # ↑ list of allowed EXIT_VALs, see documentation
编辑:咆哮如下。
eugene y的答案包括系统文档的链接。 在那里,我们可以看到每一次都需要包含一段代码,才能正确地完成system
。 eugene y的答案只是其中的一部分。
每当我们遇到这种情况时,我们将重复的代码捆绑在一个模块中。 我使用Try::Tiny
绘制了相应的简洁的exception处理,但是IPC::System::Simple
在system
完成的时候没有看到这个社区的快速接受。 似乎需要更频繁地重复。
所以, 使用autodie
! 使用IPC::System::Simple
! 节省自己的乏味,放心,使用testing代码。
my @args = qw(command --arg1=arg1 --arg2=arg2 -arg3 -arg4); system(@args) == 0 or die "system @args failed: $?";
更多信息在perldoc 。
与Perl中的所有东西一样,有多种方法可以完成它:)
最好的办法是把这些论点作为一个列表来传递:
system("command", "--arg1=arg1","--arg2=arg2","-arg3","-arg4");
虽然有时候程序似乎不能和那个版本搭配(尤其是如果他们希望从shell中调用的话)。 如果你把它作为一个单独的string,Perl将从shell调用命令。
system("command --arg1=arg1 --arg2=arg2 -arg3 -arg4");
但是这种forms比较慢。
my @args = ( "command", "--arg1=arg1", "--arg2=arg2", "-arg3", "-arg4" ); system(@args);