我可以认为它将打开一个shell,执行参数(shell命令)并以标量返回结果.但是,在Perl脚本中执行系统功能比shell命令更快.它会在C中调用此命令吗?如果是,那么它们之间有什么区别
rmdir foo
Run Code Online (Sandbox Code Playgroud)
和
system('rmdir foo');
Run Code Online (Sandbox Code Playgroud)
DVK*_*DVK 11
两者之间的区别在于第二个将打开(fork)子进程(将是rmdir命令),而第一个将使用API进行直接Unix系统调用而无需打开进程.打开子进程是昂贵的资源.
system() call将始终打开一个子进程来执行,但是,它可以打开一个shell,然后将所需的程序作为自己的子进程分叉(从而产生2个子进程),或者将程序作为子进程分叉直.
Perl将在system()调用期间打开shell的选择在perldoc -f系统中详细说明.短(而非100%准确)版本是:
如果系统调用只有一个参数,并且参数的计算结果为包含shell元字符的字符串,则首先分叉一个shell.
如果只有一个参数并且它的计算结果为无元字符; 或者有一个> 1元素的参数列表,程序直接绕过shell分叉.
从而:
system("rmdir foo"); # forks off rmdir command directly
system("rmdir", "foo"); # forks off rmdir command directly
system("rmdir foo > out.txt"); # forks off a shell because of ">"
Run Code Online (Sandbox Code Playgroud)
您的system调用将启动一个单独的进程,而Perl自己rmdir将在Perl进程的上下文中调用本机C函数.两种方法最终都会执行相同的系统调用,但打开新进程效率较低.*
最好使用Perl自己的函数(例如rmdir):它们是可移植的,您不必担心解释shell退出代码,转义文件名中的元字符以防止安全风险等.
*如果您的命令包含管道,输入/输出重定向等,system将创建一个额外的sh进程&&.这不适用于您的情况,但可以使system选项更慢.