使用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::Simplesystem完成的时候没有看到这个社区的快速接受。 似乎需要更频繁地重复。

所以, 使用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);