【发布时间】:2011-03-14 05:59:18
【问题描述】:
我是使用脚本语言的新手。我遇到了 2 种脚本语言,称为 Perl 和 Bash shell 脚本。
我想知道哪些事情可以用 Perl 脚本完成,但不能用 Bash shell 脚本完成?
谢谢。
【问题讨论】:
我是使用脚本语言的新手。我遇到了 2 种脚本语言,称为 Perl 和 Bash shell 脚本。
我想知道哪些事情可以用 Perl 脚本完成,但不能用 Bash shell 脚本完成?
谢谢。
【问题讨论】:
这里是 tl;dr 版本:如果您发现自己编写的 bash 不止一页,停止并用真正的编程语言重写。我不在乎它是 Perl、Python 还是 Ruby。只是不要创建无法维护的 500 行外壳毛球。
现在,除了现有的答案...
Perl 有一个调试器。
很多人不使用 Perl 调试器,但我非常依赖它。弄清楚一个大的 shell 脚本在做什么对我来说是一场噩梦。我发现这个循环:“在代码周围撒上调试回声,运行,查看调试输出,意识到我需要知道别的东西,撒上更多的回声,重复”非常缓慢且令人沮丧。在调试器中运行代码可以让您根据需要检查数据,并在您更好地了解所需内容时执行更多检查。
Perl 是跨平台的。
如果没有帮助,bash 脚本将无法在 Windows 上运行,但这并不是我真正要谈论的内容。 Bash 依赖于 Unix 系统附带的命令行程序的沙拉……也许吧。假设它们存在,它们的工作方式并不总是相同的。 find 和 grep 之类的东西。是 GNU 版本吗? BSD版本?也许是旧的 Sun/AIX/ 版本?它是否支持你扔给它的标志?
但是,嘿,你只使用 Fedora 或 Debian 之类的,谁在乎呢?最终,要么你的发行版会改变一些不兼容的东西,要么你想转移到一个不同的系统,突然你发现自己陷入了巨大的混乱。 “为什么那个服务器还在运行 Redhat 7?!”通常是因为它有一些脆弱的 shell 脚本在做一些重要的事情。
这让我们...
Perl 可以声明它的依赖关系。
如果 Perl 程序需要某个版本的 Perl 和某些模块,它可以通过将其作为 Perl 模块分发的相对简单的措施,以机器可读的方式声明它。 Bash 没有这样的机制(你可以创建一个 dpkg 或 rpm,这是它自己的地狱)所以你不知道你的 bash 脚本做了什么样的假设。
Perl 易于测试。
我确信分解和测试 bash 程序是可能的,并且有人编写了架构精美的 shell 代码。就像上山滑雪,或者跳舞的熊。它非常令人印象深刻,但不是很实用。所以没有人这样做。而 Perl 附带一个测试框架,有一些简单的技巧可以让即使是单文件程序也易于测试,并鼓励您将大型程序分解为库。
【讨论】:
如果这是与系统管理员相关的工作,您必须了解两者。最基本的是 shell,因为它是你在 unix 上用来执行命令的东西。 Perl 很重要,因为我发现它更容易用于字符串处理(尽管大多数你也可以在 shell 中完成),你可以使用它来自动化日志报告和检查,还可以快速将多个命令链接在一起。没有什么是 shell 不能做的,但是现在越来越多的文件是 xml 格式(例如),这在 perl 中更容易处理,与基于 Web 的界面等一样。
您还会注意到,许多工具都有可用于 perl 的模块,或者它们大部分可能是用 perl 编写的(例如 symantec 的某些产品)。
关于 python,它是一门非常好的语言,主要在 linux 平台上使用率很高(很多 redhat 和 ubuntu 工具都是用 python 编写的)。虽然在 unix 平台上不是这种情况(solaris、hpux-python 甚至没有默认安装在这些平台上),但它仍然更倾向于 perl。可能很重要,关于您的主要关注点是什么操作系统。
【讨论】:
实际上,Bash 不如 Perl 灵活。除了(索引或关联)数组之外,Bash 没有算法或数据结构,除了函数之外,没有其他方法可以对源代码进行结构化或模块化。此外(与它的不灵活相反),Bash 相当复杂且不直观,并且极容易引入难以发现的错误。所以我的建议是:尽可能避免使用 Bash,许多其他语言更适合日常编程任务。 Perl 很好,但如果你是初学者,它可能太复杂和分散注意力——做某事总是有很多方法,你可以选择最好的方法。我会推荐 Python。
如果您想/必须学习 Bash,请准备好大量信息或示例代码是幼稚的或完全错误的(当给定包含空格的文件名时,许多脚本已经中断!)。我对 Bash 编程的建议是 Greg Wooledge's wiki 上的大量文档,例如Bash guide、Bash FAQ 和 Bash pitfalls。
对于可能的反对者:我只是在谈论用作脚本语言时的 Bash,而不是用作交互式 shell 时,在这种情况下它很好。我你不认为 Bash 很烂,在这里阅读有关 Bash 的各种线程,或者阅读众所周知的 Bash Pitfalls:Bash 中的大多数问题都源于它无法正确使用数据结构以及依赖外部程序做基本的数据处理。我估计 Bash 程序员面临的所有问题中,有 95% 根本不可能出现在具有健全语法和真实数据结构和算法的语言中。
【讨论】:
要回答最基本的问题,您可以使用 perl 访问 CPAN,这(据我所知,无论如何)您无法使用 bash。 CPAN 包含的库可以做任何你想用编程语言做的事情。用 perl 做而 bash 不能(容易)做的最常见的事情之一可能是与数据库交互。
【讨论】:
我是使用脚本语言的新手。我遇到了 2 种脚本语言,称为 Perl 和 Bash shell 脚本。
酷。两者都是有用的技术,两者都可能被过度扩展而成为维护和调试的噩梦。
我想知道哪些事情可以用 Perl 脚本完成,但不能用 Bash shell 脚本完成?
两者都是turing complete,所以你可以做任何事情。但这不是一个有用的答案:)
两者各有千秋,bash(或ksh、csh)常用于配置脚本或驱动脚本。在您的/etc/init.d 目录中查找这种风格的脚本列表。一旦您超越了这些类型的脚本,bash 就会变得比它的价值更难。
Perl 在库等方面的功能更加丰富。它最大的优势(所以有人告诉我,我不怎么做 perl 编程)是文本处理。解析文本文件很方便(我认为它最初是为了)解析文本文件,这让系统管理员的生活更轻松。
你有什么建议? (你没有问这个,但我假装你问了:))
如果您想学习脚本语言,请学习python。它将是一种更熟悉的语言,易于学习且功能非常强大。了解 bash 和 python,我从不觉得有必要学习 perl - 但对涌入“程序”的错综复杂的句法感到敬畏。
您会在此过程中学习 bash,可能会阅读一两个教程,还会学习一些书签。您将主要通过在命令行中修改东西来学习它,或者将几行 .bashrc 或其他东西放在一起。不要担心“学习”它。随着时间的推移,你会慢慢吸收它,然后当你意识到你需要它的时候偷看它的角落。
【讨论】:
Perl 和 Bash 有两个不同的目标。 Perl 是一种通用语言,而 bash 只是具有一些编程功能的操作系统接口。
【讨论】:
基本上,如果我只想设置和执行程序或运行一系列“内置”命令,如 sed、grep 或 awk,我会使用 Bash。如果我必须进行任何计算、数据操作或循环,我会使用 perl。我从事 Bourne shell 脚本和 perl 已经 20 多年了。如果我刚开始,我会使用 Python 而不是 perl。
【讨论】:
Bash 是一个 shell,它并不意味着是一个完整的编程语言,如 Perl/Python。它没有模块或包之类的东西。但是,bash shell 带有编程工具,例如数组、流控制(例如 if/else)、循环(for 、while)等,可让您进行简单的脚本编写。要使 bash shell 几乎等同于 Python/Perl 的强大功能,您应该将它与 sed/awk 等 unix 工具一起使用。结合这些工具,bash 脚本/编程可以同样强大。
我不同意 Phillip 关于避免使用 Bash 的说法,因为有些事情用 shell 和 *nix 工具比用其他语言做得更好。
最后,您应该尝试学习 bash,以及 Perl 或 Python。您对它们的了解下次会派上用场。
【讨论】: