【发布时间】:2011-08-17 01:31:21
【问题描述】:
嘿,我使用 Linux 已经有一段时间了,我认为是时候深入研究 shell 脚本了。
问题是我没有发现使用 Bash 优于 Perl 或 Python 的任何显着优势。两者之间是否存在性能或功率差异?我认为 Python/Perl 会更适合功率和效率。
【问题讨论】:
标签: python linux perl bash scripting
嘿,我使用 Linux 已经有一段时间了,我认为是时候深入研究 shell 脚本了。
问题是我没有发现使用 Bash 优于 Perl 或 Python 的任何显着优势。两者之间是否存在性能或功率差异?我认为 Python/Perl 会更适合功率和效率。
【问题讨论】:
标签: python linux perl bash scripting
Perl 脚本通常(如果不是 100% 的时间)比 bash 快。
对此的讨论:Perl vs Bash
【讨论】:
与 Python 或 Perl 脚本相比,POSIX shell 脚本最重要的优势在于,几乎每台 Unix 机器上都可以使用 POSIX shell。 (还有一些任务 shell 脚本恰好更方便一些,但这不是主要问题。)如果可移植性对你来说不是问题,我认为没有太多需要学习 shell 脚本。
【讨论】:
如果你想执行机器上安装的程序,没有什么比 bash 更好的了。您总是可以从 Perl 或 Python 进行系统调用,但我发现读取返回值等很麻烦。
而且你知道它几乎可以在任何时候都在任何地方工作......
【讨论】:
syscall,因为这些 Perl 示例表明 Perl 支持:syscall(&SYS_gettimeofday, $tv, undef) >= 0 或 syscall(&SYS_setgroups, scalar @newgids, pack("i*", @newgids))
system函数,你是在炮轰,而不是在制造syscall。 当然您可以从 Perl 进行系统调用:在 Perl 中,一切皆有可能,但并非一切都是权宜之计。 ☺
优点是它就在那里。除非你使用 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。
【讨论】:
ls | parallel process
parallel process -- * 更接近。
parallel process ::: *(更接近 pexec)
shell 脚本的优势在于它在 *ix 机器上全局存在,并且具有相对稳定的核心功能集,您可以依赖它在任何地方运行。对于 Perl 和 Python,您必须担心它们是否可用,如果可用,是什么版本,因为在它们的整个生命周期中存在严重的语法不兼容。 (特别是如果您包含 Python 3 和 Perl 6。)
shell 脚本的缺点是其他方面。 Shell 脚本语言通常缺乏表现力、功能和性能。并且在没有强大的字符串处理功能和库的语言中从字符串中破解命令行以确保转义是正确的,这会引发安全问题。除非有令人信服的兼容性原因,您需要使用 shell,否则我个人每次都会选择脚本语言。
【讨论】:
想到两个优点:
简单性:直接访问所有精彩的linux工具wc、ls、cat、grep、sed...等。
为什么要经常使用python的subprocess模块?
我越来越喜欢使用gnu parallel,您可以使用它并行执行 bash 脚本。例如。从手册页中,并行批量创建目录中所有 jpg 的缩略图:
ls *.jpg | parallel convert -geometry 120 {} thumb_{}
顺便说一句,我的 bash 脚本中通常有一些 python 调用(例如用于绘图)。使用最适合任务的方法!
【讨论】:
bash 与其说是一种语言,不如说是一种命令解释器,它被黑死以允许让它看起来像一种脚本语言的东西。它非常适合最简单的 1-5 行一次性任务,但在 Perl 或 Python 中非常简单的事情(如数组操作)在 bash 中非常难看。我还发现 bash 往往不会通过两个关键的经验法则:
6 个月规则,即您应该能够轻松辨别您编写但 6 个月内未查看的脚本的目的和基本机制。
“每分钟 WTF”规则。每个人都有自己的极限,而我的极限很小。一旦我达到 3 WTFs/min,我就在别处寻找。
至于 Perl 和 Python 等脚本语言中的“脱壳”,我发现我几乎不需要这样做,fwiw(免责声明:我几乎 100% 使用 Python 编写代码)。 Python os 和shutil 模块有我大部分时间需要的大部分内容,并且有用于处理tarfile、gzip 文件、zip 文件等的内置模块。有一个glob 模块、一个fnmatch 模块......有很多那里的东西。如果遇到需要并行化的内容,则将代码缩进一个级别,将其放入“run()”方法中,将其放入扩展 threading.Thread 或 multiprocessing.Process 的类中,实例化尽可能多的那些你想要,在每一个上调用'start()'。通常不到 5 分钟即可获得并行执行。
祝你好运。希望这可以帮助。
【讨论】:
对于大型项目,请使用 Perl 之类的语言。
有些事情你只能在 bash 中做(例如,改变调用环境(当一个脚本被获取而不是运行时)。此外,shell 脚本是司空见惯的。学习基础知识和学习你的绕过可用的文档。
另外,有时了解 shell 可以节省您的 bacon(在无法启动任何新进程的 fork-bombed 系统上,或者如果 /usr/bin 和或 /usr/local/bin 无法挂载)。
【讨论】: