【问题标题】:Is there an advantage to using Bash over Perl or Python? [closed]使用 Bash 优于 Perl 或 Python 有优势吗? [关闭]
【发布时间】:2011-08-17 01:31:21
【问题描述】:

嘿,我使用 Linux 已经有一段时间了,我认为是时候深入研究 shell 脚本了。

问题是我没有发现使用 Bash 优于 Perl 或 Python 的任何显着优势。两者之间是否存在性能或功率差异?我认为 Python/Perl 会更适合功率和效率。

【问题讨论】:

    标签: python linux perl bash scripting


    【解决方案1】:

    Perl 脚本通常(如果不是 100% 的时间)比 bash 快。

    对此的讨论:Perl vs Bash

    【讨论】:

      【解决方案2】:

      与 Python 或 Perl 脚本相比,POSIX shell 脚本最重要的优势在于,几乎每台 Unix 机器上都可以使用 POSIX shell。 (还有一些任务 shell 脚本恰好更方便一些,但这不是主要问题。)如果可移植性对你来说不是问题,我认为没有太多需要学习 shell 脚本。

      【讨论】:

      • 每台 Unix 机器都带有 Perl。
      • @tchrist:总的来说,你所说的,这是完全错误的。
      • 例如在高性能计算中,您通常可以依赖 Perl 在前端节点上可用,但不一定在计算节点上可用。而且不使用 Perl 设置 Linux 机器并不难。
      【解决方案3】:

      如果你想执行机器上安装的程序,没有什么比 bash 更好的了。您总是可以从 Perl 或 Python 进行系统调用,但我发现读取返回值等很麻烦。

      而且你知道它几乎可以在任何时候都在任何地方工作......

      【讨论】:

      • 我不知道 Python 支持 syscall,因为这些 Perl 示例表明 Perl 支持:syscall(&SYS_gettimeofday, $tv, undef) >= 0syscall(&SYS_setgroups, scalar @newgids, pack("i*", @newgids))
      • “系统”调用我的意思是“到外壳”。不是文字系统调用。我不知道 Perl 可以做到这一点。
      • 我认为炮击和进行系统调用是非常不同的事情。一个只是像 shell 那样调用一些用户级程序,而另一个则直接进入内核,没有任何麻烦或大惊小怪。第一个必须使用许多系统调用;第二个,必然是一个。
      • 我同意,它们非常不同。但由于我不知道你可以从 Perl 进行 实际 系统调用,因此我使用了脚本中经常使用的“系统调用”:表示 shell 命令。
      • 如果你调用system函数,你是在炮轰,而不是在制造syscall当然您可以从 Perl 进行系统调用:在 Perl 中,一切皆有可能,但并非一切都是权宜之计。
      【解决方案4】:

      优点是它就在那里。除非你使用 Python(或 Perl)作为你的 shell,否则编写一个脚本来做一个简单的循环是一堆额外的工作。

      对于调用其他程序的简短脚本,我将使用 Bash。如果我想保留输出,我很有可能会换成 Python。

      例如:

      for file in *; do process $file ; done
      

      process 是我想在每个文件上运行的程序,或者...

      while true; do program_with_a_tendency_to_fail ; done
      

      在 Python 或 Perl 中执行这些操作都过大了。

      对于实际编写的程序,我希望随着时间的推移维护和使用,Bash 很少是适合这项工作的工具。特别是因为大多数现代 Unices 都带有 Perl 和 Python。

      【讨论】:

      • 试试这个代替你的第一个例子(少打字,多parallel):ls | parallel process
      • @Sebastian:太神奇了!虽然我认为parallel process -- * 更接近。
      • ls | xargs 进程也可以以相同的方式工作,但是所有这些方法都有一个错误:它们不适用于带有空格或换行符的文件名。你想要: for f in * ;做进程 "$f" ;完成
      • @ijw:哎呀,你说得对。固定。
      • @nmichaels:您正在使用pexec。要尝试 gnu parallel,请点击我上面评论中的链接。 PS:与 gnu parallel 的第一个示例的替代语法是:parallel process ::: *(更接近 pexec)
      【解决方案5】:

      shell 脚本的优势在于它在 *ix 机器上全局存在,并且具有相对稳定的核心功能集,您可以依赖它在任何地方运行。对于 Perl 和 Python,您必须担心它们是否可用,如果可用,是什么版本,因为在它们的整个生命周期中存在严重的语法不兼容。 (特别是如果您包含 Python 3 和 Perl 6。)

      shell 脚本的缺点是其他方面。 Shell 脚本语言通常缺乏表现力、功能和性能。并且在没有强大的字符串处理功能和库的语言中从字符串中破解命令行以确保转义是正确的,这会引发安全问题。除非有令人信服的兼容性原因,您需要使用 shell,否则我个人每次都会选择脚本语言。

      【讨论】:

      • Perl 6 安装为不同的可执行文件,因此您可以在任何情况下使用 Perl 5。
      【解决方案6】:

      想到两个优点:

      • 简单性:直接访问所有精彩的linux工具wclscatgrepsed...等。 为什么要经常使用python的subprocess模块?

      • 我越来越喜欢使用gnu parallel,您可以使用它并行执行 bash 脚本。例如。从手册页中,并行批量创建目录中所有 jpg 的缩略图:

        ls *.jpg | parallel convert -geometry 120 {} thumb_{}

      顺便说一句,我的 bash 脚本中通常有一些 python 调用(例如用于绘图)。使用最适合任务的方法!

      【讨论】:

        【解决方案7】:

        bash 与其说是一种语言,不如说是一种命令解释器,它被黑死以允许让它看起来像一种脚本语言的东西。它非常适合最简单的 1-5 行一次性任务,但在 Perl 或 Python 中非常简单的事情(如数组操作)在 bash 中非常难看。我还发现 bash 往往不会通过两个关键的经验法则:

        1. 6 个月规则,即您应该能够轻松辨别您编写但 6 个月内未查看的脚本的目的和基本机制。

        2. “每分钟 WTF”规则。每个人都有自己的极限,而我的极限很小。一旦我达到 3 WTFs/min,我就在别处寻找。

        至于 Perl 和 Python 等脚本语言中的“脱壳”,我发现我几乎不需要这样做,fwiw(免责声明:我几乎 100% 使用 Python 编写代码)。 Python os 和shutil 模块有我大部分时间需要的大部分内容,并且有用于处理tarfile、gzip 文件、zip 文件等的内置模块。有一个glob 模块、一个fnmatch 模块......有很多那里的东西。如果遇到需要并行化的内容,则将代码缩进一个级别,将其放入“run()”方法中,将其放入扩展 threading.Thread 或 multiprocessing.Process 的类中,实例化尽可能多的那些你想要,在每一个上调用'start()'。通常不到 5 分钟即可获得并行执行。

        祝你好运。希望这可以帮助。

        【讨论】:

        • 我同意,但我个人从 shell 切换到 Perl 的限制是 10-20 行。
        • Bourne shell(忽略 bash - 您通常不必求助于 bash 扩展来编写 shell 脚本)并没有被“破解”那么多,成为一种脚本语言 - 它可能是 30已有多年历史,循环、条件和函数等基本编程功能从一开始就存在。
        【解决方案8】:

        对于大型项目,请使用 Perl 之类的语言。

        有些事情你只能在 bash 中做(例如,改变调用环境(当一个脚本被获取而不是运行时)。此外,shell 脚本是司空见惯的。学习基础知识和学习你的绕过可用的文档。

        另外,有时了解 shell 可以节省您的 bacon(在无法启动任何新进程的 fork-bombed 系统上,或者如果 /usr/bin 和或 /usr/local/bin 无法挂载)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-01-09
          • 2011-05-20
          • 2010-12-18
          • 1970-01-01
          • 2014-02-27
          • 1970-01-01
          • 2012-08-22
          • 1970-01-01
          相关资源
          最近更新 更多