【问题标题】:Using system commands in Perl instead of built in libraries/functions [duplicate]在 Perl 中使用系统命令而不是内置库/函数 [重复]
【发布时间】:2013-12-28 01:11:35
【问题描述】:

有时我看到有人从 Perl(以及其他脚本语言)调用系统 grep,而不是使用内置的语言工具/库来解析文件。我想鼓励人们使用内置工具,并且我想征求一些理由来说明为什么使用内置工具是一种好的做法。我可以想到一些诸如

  • 使用库/语言工具更快。由于执行外部命令的开销,性能会受到影响。
  • 坚持使用语言设施更便携。

还有其他原因吗?

另一方面,是否有理由支持使用系统命令而不是内置语言工具?需要注意的是,如果 Perl 脚本基本上只是调用外部命令(例如,没有库的自定义实用程序),那么制作它的 shell 脚本会更好吗?

【问题讨论】:

  • 因为有些人不懂库/语言,但知道如何使用外部工具进行 smt。
  • 调用系统更容易出错。另一方面,像sort 这样的一些系统命令比 perl 的内存/cpu 效率更高,在涉及大量数据时更是如此。
  • 系统命令更不安全。即使是看似无害的命令也可以用来执行任意代码。如果有人将文件./echo#!/bin/bash \n rm -rf / 一起添加,请考虑system("echo", $foo)

标签: perl scripting


【解决方案1】:

使用外部工具会导致更多错误。 此外,您还需要解析外部命令的结果(如果有),这是另一个错误来源。 安全方面就不用说不好了。

【讨论】:

    【解决方案2】:

    实际上,在重要的时候,专门的工具可以更快。

    将工作保留在 Perl 中的真正好处是:

    • 可移植性(即使在具有相同操作系统的机器之间)。
    • 易于检测错误。
    • 错误处理的灵活性。
    • 更高的可定制性/灵活性。
    • “活动部件”更少。 (您确定您正确地转义了所有内容并正确设置了环境吗?)
    • 所需的专业知识较少。 (您不需要同时了解 Perl 和外部工具(及其端口)来编写和维护程序。)

    关于这一点,如果 Perl 脚本基本上只是调用外部命令(例如,没有库的自定义实用程序),那么制作一个 shell 脚本会更好吗?

    可能。如果任何程序返回不成功的错误代码,您可以配置一些 shell 以退出。这可以使一些脚本非常健壮。例如,我有几个 bash 脚本以该行为特色

    trap 'e=$? ; echo "Error." ; exit $e' ERR
    

    【讨论】:

    • 还有一个问题是您依赖于您无法控制的资源。例如,如果您依赖系统 find 命令,而某个小丑编写了一个 shell 脚本 find 命令,该命令执行 rm -rf 并将其放在 $PATH 的前面,该怎么办?
    • 大多数时候,人们在 Perl 中使用 system 命令是因为他们不太了解 Perl,也没有意识到 Perl 的方法。我经常看到datefindcopymail。这些都是可以在 Perl 中使用 Perl 附带的标准模块轻松处理的命令。但是,如果您是通过阅读 Perl 初学者书籍来学习 Perl 并且从未进阶过,那么您可能不熟悉 Perl 模块。
    • @David W., cp 确实比 File::Copy 有一些优势,但确实如此。
    • 使用系统命令可能有好处。例如,我遇到了SVN::Clientsystem svn... 的问题,效果更好。然而,99% 的情况下,当有人使用 system cp $foo, $bar 而不是 File::Copy 时,这是因为他们查看了 1989 年 Perl 3.0 编程手册的函数部分(我认为他们通过时空矩阵中的一个洞泄漏),见move 命令,但没有copy 命令。事实上,我见过的大多数系统命令都是针对 File::xxxx 模块的。
    【解决方案3】:

    “在硬币的另一面,有没有理由支持使用系统命令而不是内置语言工具?在那个说明中,如果 Perl 脚本基本上只调用外部命令(例如,没有库的自定义实用程序), 做一个shell脚本会更好吗?”

    在这里冒着激怒 Perl 强硬派的风险。但对我来说,使用 system grep 而不是 perl grep 有一个简单的理由:我知道它的语法。

    使用 Perl 脚本而不是 bash 脚本的相同原因:我知道如何在 Perl 中做事,并且从不为 bash 脚本语法所困扰。

    当我们在这里讨论脚本时,我主要关心的是让它快速可靠地完成(并且可读)。在工作中,我不必为便携性而烦恼,因为所有生产都是在同一个系统上完成的,在整个产品生命周期内,所有东西都使用相同的软件版本。

    在家里,我不必关心生命周期或其他任何事情,因为脚本很可能是单一用途的。

    在这两种情况下,我都不关心性能或软件安全性,因为我会在商业软件或时间或内存有限的情况下使用 C++ 或其他东西。

    edit:并不是说这些理由适用于任何人,甚至任何其他人。但实际上我知道如何使用 Perls grep,但我真的不知道如何编写 bash 脚本,而且很可能永远不会。在 Perl 中添加几行代码对我来说总是更快。

    【讨论】:

    • 我知道 A 有一个答案,但 B 不是很好。 难题:学习 。学习这些东西并了解它是我的工作。我阅读 StackOverflow 的主要原因是学习新事物。这是我了解 Perl 智能匹配的地方(是的!),我还了解到 Perl 智能匹配现在已被弃用(该死!)。在这里我可以找到我应该知道的新书和新技术。我可以理解,如果你必须做一些快速和肮脏的事情来快速和肮脏地做,但之后你也应该学习正确的方法。
    • 成为 bash 脚本专家不是我的工作。制作分配给我的模块是我的工作。在 C++ 中。有时我的工作是为测试例程创建脚本或自动记录、排序和移动数据。我的老板几乎不在乎我是用 Perl 还是 Bash 脚本做的,只要我做的及时、可靠和可读。我确实理解其他人有其他工作和其他老板,我的观点只是,可能有理由不了解每种工具,因此有时不使用最好的工具,而只是适合工作的工具。
    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2021-11-24
    相关资源
    最近更新 更多