【问题标题】:What's the difference between system, exec, and backticks in Perl?Perl 中的 system、exec 和 backticks 有什么区别?
【发布时间】:2010-11-25 12:30:35
【问题描述】:

在 Perl 中,要从我的脚本运行另一个 Perl 脚本,或者运行任何系统命令,如 mvcppkgaddpkgrmpkginforpm 等,我们可以使用以下:

  • system()
  • exec()
  • ``(反引号)

这三个是一样的,还是不同的?这三个在每种情况下都给出相同的结果吗?它们是否用于不同的场景,比如调用 Perl 程序我们必须使用 system() 而对于其他我们必须使用 ``(反引号)。

请告知,因为我目前正在使用system() 进行所有通话。

【问题讨论】:

标签: perl ipc


【解决方案1】:

它们都是不同的,文档解释了它们的不同之处。反引号捕获并返回输出; system 返回退出状态,如果成功,exec 永远不会返回。

【讨论】:

    【解决方案2】:

    IPC::System::Simple 可能是你想要的。

    它为反引号、system() 和其他 IPC 命令提供安全、便携的替代方案。

    它还允许您在大多数上述命令中避免使用 shell,这在某些情况下会有所帮助。

    【讨论】:

      【解决方案3】:

      最好的选项是使用标准库或 CPAN 中的某个模块来为您完成这项工作。它将更便携,并且对于快速任务可能更快(无需分叉到系统)。

      但是,如果这对您来说还不够好,您可以使用这三个中的一个,不,它们不一样。阅读system()exec()backticks 上的perldoc 页面以了解区别。

      【讨论】:

      • perlop 中不止一个页面(“Quote-Like Operators”部分,“qx/STRING/”小节)以及perldoc -f readpipe
      • 我找到了。看来我错过了一些树木的森林。什么的。
      【解决方案4】:

      调用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 脚本中了。

      【讨论】:

      • 我不会说这通常是一个错误,只是您可能能够在纯 Perl 中完成该任务。 system() 有很多有效的用途。
      • 我并不是说调用system 是一个错误,但大多数时候人们称之为错误。您需要有充分的理由致电system
      【解决方案5】:

      嗯,人越多答案越多。

      我的回答是通常避免执行外部命令。如果可以 - 使用模块。执行“cp”、“mv”和许多其他命令是没有意义的——存在执行此操作的模块。使用模块的好处是它们通常可以跨平台工作。虽然您的 system("mv") 可能不会。

      当我没有其他办法,只能调用外部命令时,我更喜欢使用IPC::Run。这个想法是所有简单的方法(反引号、qx、系统、用管道打开)本质上是不安全的,并且需要注意参数。

      使用IPC::Run,我可以像使用 system(@array) 一样运行命令,这更加安全,并且我可以使用变量或回调分别绑定到 stdin、stdout 和 stderr,即 非常当您必须将数据从长时间运行的代码传递到外部程序的情况下,这很酷。

      此外,它还具有内置的超时处理功能,可以多次派上用场:)

      【讨论】:

        【解决方案6】:

        如果你不想让 shell 参与进来(通常你不会)并且如果等待系统命令是可以接受的,我推荐使用IPC::Run3。它简单、灵活,可以完成执行程序、为其提供输入并正确捕获其输出和错误流的常见任务。

        【讨论】:

          猜你喜欢
          • 2010-10-22
          • 2012-06-05
          • 2010-12-23
          • 2011-11-15
          • 2010-12-14
          • 1970-01-01
          • 2010-10-07
          • 2012-01-22
          相关资源
          最近更新 更多