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

时间:2011-05-02 15:12:54

标签: python linux perl bash scripting

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

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

8 个答案:

答案 0 :(得分:17)

我想到了两个好处:

  • 简单:直接访问所有精彩的linux工具wclscatgrepsed ..等等 为什么要经常使用python的subprocess模块?
  • 我越来越喜欢使用gnu parallel,您可以使用{{3}}并行执行bash脚本。例如。从手册页中,批量创建目录中所有jpgs的大拇指:

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

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

答案 1 :(得分:8)

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

对此的讨论:Perl vs Bash

答案 2 :(得分:5)

bash不是一种语言,而是一种被黑客攻击的命令解释器,以允许使它看起来像脚本语言的东西。这对于最简单的1-5行一次性任务来说非常棒,但是在Perl中使用简单的东西或者像数组操作那样的Python在bash中非常难看。我还发现bash往往不会通过两个关键的经验法则:

  1. 这个为期6个月的规则,它说你应该能够轻松辨别你写的剧本的目的和基本机制,但在6个月内没有看过。

  2. “每分钟WTF”规则。每个人都有自己的极限,我的很小。一旦我达到3 WTF /分钟,我正在寻找其他地方。

  3. 对于像Perl和Python这样的脚本语言中的'shelling out',我发现我几乎从不需要这样做,fwiw(免责声明:我在Python中几乎100%编码)。 Python os和shutil模块具有我大多数时间需要的大部分内容,并且有用于处理tarfiles,gzip文件,zip文件等的内置模块。有一个glob模块,一个fnmatch模块......有很多那里的东西。如果你遇到需要并行化的东西,那么将代码缩进一个级别,将它放在'run()'方法中,将它放在一个扩展threading.Thread或multiprocessing.Process的类中,实例化其中的多个你想要,在每一个上调用'start()'。一般不到5分钟就能完成并行执行。

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

答案 3 :(得分: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。

答案 4 :(得分:4)

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

有一些事情你只能在bash中做(例如,改变调用环境(当脚本是源而不是运行时)。而且,shell脚本很常见。值得学习基础知识并学习你的知识。绕过可用的文档。

另外有时候知道一个shell可以保存你的培根(在一个无法启动任何新进程的叉式轰炸系统上,或者如果/usr/bin/usr/local/bin无法安装)。

答案 5 :(得分:3)

POSIX shell脚本相对于Python或Perl脚本最重要的优点是几乎每台Unix机器上都可以使用POSIX shell。 (还有一些任务shell脚本碰巧稍微方便一些,但这不是一个主要问题。)如果可移植性对你来说不是问题,我认为不需要学习shell脚本。

答案 6 :(得分:2)

如果你想执行机器上安装的程序,没有什么能比bash好。你总是可以从Perl或Python进行系统调用,但我觉得阅读返回值等是一件麻烦事。

因为你知道它在任何时候都可以在任何地方工作......

答案 7 :(得分:1)

shell脚本的优势在于它全局存在于* ix盒子上,并且具有相对稳定的核心功能集,您可以依赖这些功能在任何地方运行。使用Perl和Python,您必须担心它们是否可用以及是否可用,因为在它们的生命周期中存在显着的语法不兼容性。 (特别是如果你包括Python 3和Perl 6。)

shell脚本的缺点是其他一切。 Shell脚本语言通常缺乏表现力,功能和性能。并且在没有强大的字符串处理功能和库的情况下将字符串中的命令行绑定在一起,以确保转义是正确的,会引发安全问题。除非有一个令人信服的兼容性原因,你需要使用shell,我个人每次都会喜欢使用脚本语言。