何时使用 Bash,何时使用 Perl/Python/Ruby?

fut*_*lib 83 linux script bash perl ruby

到目前为止,我们正在使用 Bash 编写所有脚本,但我开始觉得它有点傻。虽然我们当然可以用 Bash 做我们想做的一切(它非常强大),但我开始怀疑我们是否不应该使用适当的脚本语言(在我们的例子中很可能是 Ruby)。

您如何决定何时在脚本中使用 Perl/Python/Ruby 而不是 Bash?我认为使用 Ruby 的 init 脚本没有意义,但是添加电子邮件帐户的稍长脚本怎么样?

小智 62

TL;DR -将 bash用于安装更好的语言(如果它尚不可用),否则您将浪费不可恢复的宝贵时间。如果您不能毫无错误地在命令行上执行此操作,请不要使用 bash/shell 编写脚本。

现在是 2015 年,所以我会考虑以下几点:

  1. 内存开销

    • 与 bash 相比,Ruby/Python 运行时内存开销很小(因为共享库),而无论如何都可能无法维护非平凡的 bash 脚本(即超过 100 行的脚本)-因此内存使用不是一个因素
  2. 启动时间

    • Ruby/Python 启动可能会稍微慢一点,但是您很可能不会以每秒 100 次的紧密循环运行大量完整的 Ruby/Python 进程(如果您有这些需求,bash/shell 是无论如何,开销太大,您可能需要使用 C/C++)
  3. 表现

    • 几乎所有典型的数据处理在 Ruby/Python 中都会更快——或者至少是可比的(或者,你需要 C/C++/Haskel/OCaml/无论如何)
    • 执行中的真正性能/瓶颈(甚至生产力)几乎永远不会是“缺乏使用 bash/shell”(即使是 Ubuntu 启动时切换破折号也表明 bash 实际上是问题所在——而busybox 可能是唯一的用例,因为那里没有什么比“庆典”和“VI”编写和运行代码,而且也往往没有办法添加/下载或存储任何东西)
    • 运行其他进程来完成这项工作(如 sed/awk/grep)实际上比在内存中的活动对象上调用方法慢得多
  4. 生产率

    • 与在 Ruby/Python 中使用“真正的”方法、参数、变量和异常相比,在 Bash/shell 中犯错误太容易了
    • 敏捷是主流,而 Bash 不支持它(缺乏单元测试功能、库、面向对象、模块化、linting、内省、日志记录、元编程;几乎不可能在不破坏某些东西的情况下进行重构)
    • 与其他 shell 的太多不兼容,较小的环境变量可以完全破坏脚本(并且一些重要的 dev-ops 工具如 Puppet 会忽略 shebang 行并传递或重写重要的 shell 变量),而 Ruby/Python 具有定义明确的相对平滑的迁移即使是主要版本更改的路径
    • 由于特定于 shell 的问题(特别是 - 变量名、没有布尔值、没有异常等),学习一门新语言需要花费一小部分时间或者花在调试 shell 脚本上
    • 甚至启动脚本也是一个地雷(尤其是因为它们可能会在系统启动期间失败),并且鉴于最近 bash 的安全漏洞,您最好使用纯 C(具有良好的库)-是的,C 需要编译、配置等。 ,但即使是一个简单的 shell 脚本也可能需要一个存储库,然后进行版本控制,然后无论如何打包。
    • sed/awk/grep 可用的任何内容都可能已经内置到 Ruby/Python 中 - 没有它是依赖项,或者跨平台这些工具的版本之间的“差异”(那么如果它适用于您的设置会怎样)
  5. 就业保障
    • 获得一份你不​​喜欢的工作有什么意义?(除非你喜欢把所有这些时间都花在难以调试但制作 shell 脚本的漏洞上)

我发现如果您安装了 Ruby/Python,就没有理由使用 Bash/Shell。

并且可能安装 Ruby/Python 甚至不需要 bash 脚本(除了 busybox,一些系统工具无论如何都依赖于 Python/Perl 的存在)。

每次编写 shell 脚本时,您都是在“练习”这样做——而不是学习更强大/更有成效的东西。

为什么现在人们使用 Bash?因为这是一个可怕的、难以打破的习惯。剧本很少会在开始几分钟后“永远完成”——无论人们倾向于如何强烈地这样想。伴随着“这是这个脚本中的最后一个错误”的谬论。

结论:只有在您绝对被迫(例如~/.bashrc,busybox)时才使用 bash/shell ,因为现在它几乎从来都不是“适合工作的工具”。

  • 我认为这是一个过于笼统的声明。如果您实际上是在开发应用程序并且关心性能,那么请使用实际的编程语言,如 perl/python/ruby(或 Rust/Go/C)。但是如果你只是想要一些简单的东西,比如在启动时运行一个命令 n 次,那么使用你喜欢的任何东西。bash 的好处是,如果你不知道你的脚本将在什么环境中运行,那么几乎每个 *nix 都有某种 POSIX shell 可以运行大多数 bash 脚本。 (2认同)

mka*_*ito 47

考虑到两者都可以处理的问题,您将希望使用最适合您的那个。归根结底,还有很多小细节,只有经验才能教你看到它们。

Bash 是一种通用脚本语言,就像 Python、Ruby、Perl 一样,但每种语言都有不同的优势。Perl 擅长文本分析,Python 声称是同类中最优雅的,Bash 脚本非常擅长“管道传输”,如果你明白我的意思,还有 Ruby ......好吧,Ruby 在很多方面都有点特别的方式。

但是,只有当您拥有大量的脚本编写经验时,它们之间的差异才真正重要。我建议您选择一种语言并将其推到极限,然后再转到下一种语言。您可以在 shell 脚本中做很多事情,这比大多数人承认的要多。任何语言都和你想要的一样难。在你用它写了几件事之后,每种语言对你来说都是“容易”的。

如果您住在 Linux 中,熟悉 shell 会很快得到回报,所以也许您想从它开始。如果您发现在 shell 脚本中无法解决或不切实际的任务,请使用其他方法。

另外,请记住,学习 shell 脚本非常简单。它的真正威力在于其他程序,如 awk、sed、tr 等。


che*_*ner 31

当我主要关注文件处理时,我使用 bash。这可能包括移动、复制和重命名文件,以及将文件用作其他程序的输入或将其他程序的输出存储在文件中。我很少编写实际检查文件内容或生成输出以写入文件的 bash 代码;我把它留给我通过 bash 启动的其他程序(我可以用 Perl 或 python 编写)。

当我主要关注从文件读取数据、以某种方式处理该数据以及将输出写入文件时,我使用 Perl 和 python。如果我发现自己使用(在 Perl 中)system命令、反引号或(在 python 中)subprocess模块过于广泛,我会考虑用 bash 编写脚本。另一方面,我有时会开始向 bash 脚本添加如此多的功能,最终用 Perl/python 重写它更有意义,而不是处理 bash 对变量范围、函数、数据结构等的有限(比较)支持.

  • 每当需要文件读取/文本生成时,我也使用 t0 在 Bash 上保释,但是在学习了由 `[[]]` 支持的 `=~` 运算符后,我一直喜欢使用一些 Bash 来*简单* 文件读取 (2认同)

小智 19

我喜欢这篇博文中规定的标准。

  • 如果没有要传入的任何参数,则它可能是一个 shell 脚本。
  • 如果没有太多的控制逻辑(除了单个循环或 if/else),它可能是一个 shell 脚本。
  • 如果任务是命令行指令的自动化,那么它几乎肯定是一个 shell 脚本。


buz*_*791 9

我发现这个 Perl 与 Bash 分析很有用......

http://blogs.perl.org/users/buddy_burden/2012/04/perl-vs-shell-scripts.html

为方便起见,我复制了该作者的摘要:1)当 bash 是更好的发现时,以及 2)当 perl 是更好的结论时......

当 Bash 更好时...

  • 工作失败
  • 退出命令
  • 处理作业输出行
  • 这里的文件
  • 文件等效项
  • 文件时间戳比较
  • 波浪号扩展

当 Perl 更好时...

对于大多数应用程序来说,Perl 仍然胜过 bash。我可能更喜欢 Perl 的原因包括(但不限于):

  • 它会更快。主要是因为我实际上并不需要为我想做的许多事情启动新进程(basename 和 dirname 是最明显的例子,但通常 cut、grep、sort 和 wc 也都可以消除)。
  • bash 中的字符串处理充其量只是基本的,整个 $IFS 的东西都非常笨重。
  • shell 脚本中的条件可能是不稳定的。
  • 在 shell 脚本中引用可能是一场噩梦。
  • 除了简单的案例 (NPI) 之外,bash 的 case 语句还有很多不足之处。
  • bash 中的数组很糟糕。bash 中的哈希(假设你的 bash 足够新,可以拥有它们)更难。
  • 一旦处理文件或命令输出超出了我上面列出的简单情况,Perl 就开始真正冒烟了。
  • CPAN。

因此,bash 不会很快接管 Perl。但我仍然发现,这么多年过去了,很多时候一个简单的 shell 脚本有时比一个简单的 Perl 脚本更简单。正如我所说,我欢迎所有试图说服我的尝试。但是,话又说回来,在您的工具箱中使用一些不同的工具并没有错。


小智 6

根据我的经验,bash 与 python 是开发时间和灵活性之间的权衡。通常可以在 bash 脚本中比在 python 脚本中更快地建立问题的基本解决方案。

与等效的 bash 脚本相比,Python 往往会让您更多地考虑解决方案的结构。Python 比 bash 脚本具有更强的表达能力,因此随着时间的推移,它倾向于更好地扩展和修改。总的来说,它仍然更具可读性。

Bash 更接近于文件系统,并且非常适合用于解决未明确定义的问题的初稿解决方案。出于这个原因,bash 脚本可能是一个很好的首选,它可以在更好地理解问题后将其移植到 python 中。


bak*_*ytn 5

Bash 是一个 Unix shell,它包含一种脚本语言。它是命令处理器。你控制你如何运行命令的方式,你实际上是在运行它们。

Perl/Ruby/Python 是通用语言。

当你想要一个 shell 脚本时,你使用 Bash

如果您想要更复杂的任务或与 shell 无关。使用 Python 等。

实际上,我永远不会比较这些语言。Python 等是可移植的。你可以在任何地方运行它们。Bash 仅适用于 Unix。

Python 等拥有大量可重用的库,可解决数百万个任务。

如果你问,这几乎是一样的。“何时使用 Paint 以及何时使用 Photoshop”

对于处理电子邮件,我会再次使用 Ruby,因为它有很多可重用的库。

最好的方法是结合 bash 和 ruby​​。那就对了。就像您在 ruby​​ 中创建电子邮件处理脚本一样,bash 脚本将调用该 ruby​​ 脚本并运行其他命令 ds。

因此,无论何时您需要命令处理器,您都可以使用 bash。您运行 unix 命令并控制它们。

7 年后更新(2019 年 3 月)

虽然我的答案的主要部分没有改变,但我想指出这一点。

Bash 也是一种强大的脚本语言。对于文本处理,它可能是一个绝对合法的选择。

请阅读下面 mkaito 的评论。它们都是完全正确的。

  • 好吧,如果 Bash 是地板,那么 Haskell 之类的东西一定是钉板 :-) (2认同)