与Perl或Python相比,使用Bash是否有优势?

与Perl或Python相比,使用Bash是否有优势?,python,linux,perl,bash,scripting,Python,Linux,Perl,Bash,Scripting,嘿,我使用Linux已经有一段时间了,我想是时候开始编写shell脚本了 问题是,我没有发现使用Bash比使用Perl或Python有任何显著的优势。两者之间是否存在性能或功率差异?我认为Python/Perl在性能和效率方面更合适。Perl脚本通常(如果不是100%的话)比bash快 关于这一点的讨论:与Python或Perl脚本相比,POSIX shell脚本最重要的优点是,POSIX shell几乎可以在每台Unix机器上使用。(还有一些任务shell脚本恰好更方便,但这不是一个大问题。)

嘿,我使用Linux已经有一段时间了,我想是时候开始编写shell脚本了

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

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


关于这一点的讨论:

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

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


因为你知道它几乎可以在任何时间的任何地方工作…

优点是它就在那里。除非您使用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很少是合适的工具。尤其是因为大多数现代Unice都带有Perl和Python。

shell脚本的优点是它在*ix框中全局存在,并且有一组相对稳定的核心功能,可以在任何地方运行。使用Perl和Python时,您必须担心它们是否可用,如果可用,需要考虑什么版本,因为在它们的整个生命周期中存在着严重的语法不兼容。(尤其是在包含Python 3和Perl 6的情况下。)


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

想到两个优点:

  • 简单性:直接访问所有精彩的linux工具
    wc
    ls
    cat
    grep
    sed
    。。。等 为什么要经常使用python的
    子流程
    模块

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

    ls*.jpg |并行转换-几何120{}拇指{}


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

bash与其说是一种语言,不如说是一种命令解释器,它被黑客攻击致死,目的是让它看起来像一种脚本语言。对于最简单的1-5行一次性任务来说,它非常好,但是在Perl或Python中非常简单的事情,比如数组操作,在bash中就非常难看。我还发现bash往往不通过两条关键的经验法则:

  • 6个月的规则,即你应该能够很容易地辨别出你写了6个月没有看过的脚本的目的和基本机制

  • “每分钟WTF”规则。每个人都有自己的极限,而我的极限很小。一旦我达到每分钟3个WTF,我就会去别处寻找

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


    祝你好运。希望这有帮助

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

    只有在bash中才能做一些事情(例如,改变调用环境(当脚本是源代码而不是运行脚本时)。此外,shell脚本是很常见的。学习基本知识和了解可用文档的方法是值得的


    此外,有时熟悉一个shell可以节省您的时间(在一个被叉子炸过的系统上,您无法启动任何新的进程,或者如果
    /usr/bin
    /usr/local/bin
    无法装载)。

    尝试用这个替代您的第一个示例(少输入,多输入):
    ls | parallel process
    @Sebastian:Magical!虽然我认为
    parallel process--*
    更接近。ls | xargs process也会以同样的方式工作,但所有这些方法都有一个bug:它们不适用于带有空格或换行符的文件名。您想要:对于f in*;处理“$f” ; done@ijw:哇,你说得对。修复了。@nmichaels:你正在使用。要尝试gnu并行,请按照我上面评论中的链接进行操作。PS:第一个gnu并行示例的另一种语法是:
    parallel process