在Perl或Python上使用Bash是否有优势?

嘿,我一直在使用Linux一段时间,并认为是时候最后深入shell脚本

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

想到两个好处:

  • 简单:直接访问所有美妙的Linux工具wclscatgrepsed等等。为什么经常使用python的subprocess模块?
  • 我越来越喜欢使用gnu parallel并行执行你的bash脚本。 例如,从手册页中,并行地批量创建目录中的所有jpgs的大拇指:

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

顺便说一下,我通常在我的bash脚本中有一些python调用(例如绘图)。 使用任何最好的任务!

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

关于这个的讨论: Perl vs Bash

bash不是一个语言,就像一个命令解释器,它被砍死,以使它看起来像一种脚本语言。 最简单的1-5行一次性任务非常棒,但是在Perl或者Python中像数组操作一样简单的东西在bash中是非常丑陋的。 我也发现bash往往不会通过两个关键的经验法则:

  1. 6个月的规则说,你应该能够很容易地辨别你写的脚本的目的和基本的机制,但在6个月内没有看过。

  2. “每分钟WTF”规则。 每个人都有自己的限制,我的很小。 一旦我达到3跆拳道/分钟,我在别处看。

至于像Perl和Python这样的脚本语言中的“炮轰”,我发现我几乎从不需要这样做,fwiw(免责声明:我在Python中几乎100%的代码)。 Python os和shutil模块大部分时间都是我最需要的,并且内置了用于处理tarfiles,gzip文件,zip文件等的模块。有一个glob模块,一个fnmatch模块…有很多那里的东西。 如果你碰到需要并行化的东西,那么把你的代码缩进一个层次,把它放在一个'run()'方法中,把它放在一个扩展了threading.Thread或者multiprocessing.Process的类中,实例化你想,每个调用“开始()”。 一般不到5分钟即可获得并行执行。

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

对于大型项目,使用像Perl这样的语言。

有几件事情你只能在bash中做(例如,改变调用环境(当脚本来源而不是运行时)。而且,shell脚本是司空见惯的。值得学习基础和围绕可用的文档。

此外,有时候了解一个shell可以节省你的培根(在叉式系统上你不能启动任何新进程,或者/usr/bin/usr/local/bin无法挂载)。

好处是它就在那里。 除非你使用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。

POSIX shell脚本比Python或Perl脚本最重要的优点是几乎每个Unix机器上都可以使用POSIX shell。 (也有一些任务shell脚本稍微更方便一些,但这不是一个大问题。)如果可移植性不是你的问题,我不觉得太需要学习shell脚本。

如果你想执行安装在机器上的程序,没有什么比击败bash。 你总是可以从Perl或Python进行系统调用,但是我发现读取返回值是一件麻烦的事情。

而且既然你知道它会在任何时间的任何地方工作…

shell脚本的优点在于它全局在* ix框中,并且具有相对稳定的核心功能,您可以依靠这些功能在任何地方运行。 使用Perl和Python,你不得不担心它们是否可用,如果是的话,又是什么版本,因为它们的整个生命周期中都存在着严重的语法不兼容问题。 (特别是如果你包括Python 3和Perl 6)

shell脚本的缺点是一切。 Shell脚本语言通常缺乏表现力,功能和性能。 并且从一个没有强大的字符串处理功能和库的语言的字符串一起黑屏命令行,以确保转义是正确的,引发安全问题。 除非有一个令人信服的兼容性原因,否则你需要使用shell,每次我都会亲自为脚本语言写满。