什么';在';系统&x27;Perl中的函数?

什么';在';系统&x27;Perl中的函数?,perl,Perl,我认为它将打开一个shell,执行参数(shell命令)并以标量形式返回结果。 但是,Perl脚本中的execute函数比shell命令快。 它将在C中调用此命令? 如果是,两者的区别是什么 rmdir foo 及 两者之间的区别在于,第二个将打开(fork)子进程(这将是rmdir命令),而第一个将使用API直接进行Unix系统调用,而不打开进程。打开子进程的成本很高资源方面 system()调用将始终打开要执行的子进程,但是,它可以打开一个shell,该shell将把所需的程序作为自己的子

我认为它将打开一个shell,执行参数(shell命令)并以标量形式返回结果。 但是,Perl脚本中的execute函数比shell命令快。 它将在C中调用此命令? 如果是,两者的区别是什么

rmdir foo

  • 两者之间的区别在于,第二个将打开(fork)子进程(这将是rmdir命令),而第一个将使用API直接进行Unix系统调用,而不打开进程。打开子进程的成本很高资源方面

  • system()
    调用将始终打开要执行的子进程,但是,它可以打开一个shell,该shell将把所需的程序作为自己的子进程分叉(从而产生两个子进程),或者直接将该程序作为子进程分叉

    system()
    调用期间,Perl何时打开shell的选择在中详细说明。简短(并非100%准确)版本为:

    • 如果系统调用只有一个参数,并且该参数的计算结果是一个包含shell元字符的字符串,那么将首先分叉一个shell

    • 如果只有一个参数且其计算结果为无元字符;或者有一个>1元素的参数列表,程序直接绕过shell分叉

  • 因此:


    您的
    system
    调用启动一个单独的进程,而Perl自己的
    rmdir
    将在Perl进程的上下文中调用本机C函数。这两种方法最终都会执行相同的系统调用,但打开一个新进程的效率较低*

    最好使用Perl自己的函数(如
    rmdir
    ):它们是可移植的,您不必担心解释shell退出代码、转义文件名中的元字符以防止安全风险等问题


    *如果您的命令包含管道、输入/输出重定向、
    &&
    等,则
    系统
    将创建一个额外的
    sh
    进程。这不适用于您的情况,但会使
    系统
    选项的速度更慢。

    尽量不要不必要地调用系统命令,除非它的专利和Perl还没有模块/API。要删除目录,请使用Perl自己的rmdir()。操作系统的许多系统命令都可以用Perl来完成,您可以在以下位置阅读文档。系统的条目回答了这个问题。询问您不理解的文档的qeustions是可以的,但至少先尝试一下:)此外,您还可以在上个星期的有效Perler:For the this-this-call'system(“rmdir foo>out.txt”);中阅读更多关于不同类型Perl交互的信息最好使用Shell脚本!不是吗?@JohnJohnGa-如果这是一个节目中唯一的一行,是的。如果这是50行Perl代码中的1行,需要500行等效的shell脚本,则不会。如果这是web应用程序中的1行,并且您决定用shell脚本编写web应用程序,我很遗憾您和您的雇主:)
    system('rmdir foo');
    
    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 ">"