今天最好的(便携和可维护)Shell脚本语言是什么?

6
我知道这个问题在过去引发了“宗教”战争,可能没有一个正确的答案。但是在过去的3-4年中,我一直在使用ksh和csh,并经历了从一个平台移植到另一个平台或将一个通用逻辑应用于多个版本(即传统代码)的痛苦。如果我要编写一个新脚本,我会选择ksh,但这只是出于被迫而非选择。除了ksh/csh之外,是否有更好的选择?还有一些跨Unix(Solaris/HP/IBM/FreeBSD)和Linux(如果我没有要求太多或者所有Linux版本都可以)可移植的选项吗?
等待建议...
祝你平安 :) Devang Kamdar

1
请注意,ksh 几乎是 Posix-Shell 的一个适当超集。差异很小,而且微妙(例如内置-v-用户定义函数的默认优先顺序)。我用 ksh 进行交互式工作,但在 (posix) sh 中编写脚本。 - Stan Graves
6个回答

9
我建议使用普通的sh,因为它无处不在。
此外,值得注意的是可移植性不仅包括shell,还包括脚本中使用的其他命令,如awkgreppsecho

2
一定要坚持使用命令的 POSIX 兼容子集功能。至少在基于 Debian 的发行版本下,您可以获取 POSIX 手册页,如 manpages-posix{-dev},然后您可以通过 man 1posix awk 访问(例如)POSIX awk 的手册页。 - porges
另一个值得一提的标准是单一Unix规范。 - mouviciel
我认为sh是一个相当安全的选择,但正如Stephen Darlington在下面指出的那样,它可能没有很多友好的功能...目前为止,我想从所有建议中得出的结论是,除非你正在修改现有的脚本,否则没有理由用shell编写新脚本。Perl/Python/Ruby等替代方案是有道理的,因为它们自然而然地具有很大的可移植性,并且在这里速度不应该是一个大问题——感谢TheMarko的帖子提供了这个新的视角:) - Devang Kamdar
尽管可移植性很重要,但问题中还包含了“可维护”作为一个关键词,你完全没有考虑它。 "sh" 脚本是不可维护的。它们经常依赖于各种骗局来尝试完成所需的任务,因为 POSIX sh 或 Bourne 并没有提供必要的功能。如果您需要脚本编程,则建议使用 bash,如果您可以承担依赖项,则可以使用 Perl/Python/Ruby。 - lhunath
但是如何检查shell脚本的语法和语义是否符合POSIX标准呢? - mceo
显示剩余2条评论

4
如果你真的想让它具有可移植性(我不知道任何shell脚本是可维护的),我会指定#!/bin/sh并使用dash测试,如果可能的话,还可以使用其他shell。

4
Debian的衍生版也将在“devscripts”软件包中拥有名为“checkbashims”的脚本,该脚本将检查脚本中是否存在不符合sh标准的行为。 - porges

2

我认为BASH目前应该是最广泛使用的shell,因为它是许多Linux发行版的默认shell(即使在Windows上也可以通过cygwin运行,但其他shell也可能如此)。 另一种选择可能是不使用shell本身进行脚本编写,而是使用像perl、python、ruby等脚本语言中的一种。


1
我是说使用Perl/Python等来进行脚本编写真的很有意义 :) - Devang Kamdar

2
我通常使用ksh。我发现它在功能和可移植性之间取得了良好的平衡。它(或兼容版本)存在于大多数Linux和Solaris上。虽然我已经有一段时间没用HP-UX了(谢天谢地),但我相信它也可以在那里使用。
如果您需要支持的所有计算机都是现代的,bash可能是一个选择。Solaris 10附带了一个副本。它是大多数Linux机器的默认选项。
您最低的共同点将是Bourne(sh),因此如果可移植性是您的主要关注点,那么这值得考虑。但它缺少一些更友好的ksh和bash功能。
在脚本编写方面,仍然值得避开csh/tcsh。Csh Programming Considered Harmful 是一篇老文章,但仍然基本适用。

我之前读过那篇《Csh编程被视为有害》的文章...确实是一篇非常好的文章...谢谢分享。 - Devang Kamdar
ksh几乎是Posix shell的一个合适超集,并且仍然是我今天交互式shell的选择。我也在HP-UX上花了很多时间,ksh是一些旧版本可用的最佳shell。如果当初我从Linux开始,我可能会使用bash。 - Stan Graves

0

我的答案会是perl。

以一种更加优雅和漂亮的方式完成了'sh'、'bash'等所能做的一切。

而且它实际上更具可移植性。给定版本的perl在所有平台上非常一致。Linux、Solaris和AIX发行版之间没有显著差异,而在这些平台之间移植shell脚本真的很麻烦。

而且它适用于所有的Windows平台!只要避免使用反引号和"system()",你的脚本有很大机会运行。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接