我们正在为 Linux 系统编写脚本,对于 Linux 目前最通用的脚本语言是什么存在一些争论。 Bash、SH、Posix?什么?
答案1
每个类 UNIX 操作系统上都有两种图灵完备的编程环境,并且能够调用其他程序:awk, 和嘘,Bourne/POSIX shell 系列。 AWK 面向文本处理(它补充了更专业的实用程序),而 sh 面向成为将程序组合在一起的粘合语言。什是这Linux 和 UNIX 世界上的通用脚本语言。
这POSIX标准定义了 sh 本身和相关实用程序的强制功能。大多数类 UNIX 系统都遵循POSIX 1003.1-2004(又名 Single Unix v3,又名 Open Group Base 规范第 6 期);该标准的最新版本是POSIX 1003.1-2008(又名 Single Unix v4,又名 Open Group 基本规范第 7 期)。
每个 Linux 和 unix 或类 Unix 系统在 路径 处都有一个 Bourne 风格的 shell /bin/sh
,任何非古董系统都有一个 POSIX 兼容的 shell(除非偶尔出现 bug)。每个现代类 UNIX 系统(包括 Linux)都支持她怦然心动,因此/bin/sh
如果第一行是 ,它会自动运行脚本#!/bin/sh
。有些 POSIX 系统位于sh
另一个地方(通常是操作系统上的模拟层,您不会认为它真的像 Unix 那样)。
嵌入式 Linux 系统可能有一个精简版忙碌盒未实现所有 POSIX 功能的系统。 BusyBox 有大量编译时选项来适应小型系统,因此很难提前知道会发生什么,您必须针对特定设备定制脚本。 BusyBox 是 sh 和各种实用程序最常见的小型实现;您可能会遇到的另一个问题是 Android 中 shell 环境的极度简化(后续版本不再那么贫乏)。
非嵌入式 Linux 系统几乎总是有短跑或者巴什作为/bin/sh
。 Dash 是一个小而快速的 shell,仅实现 POSIX 功能。 Bash 是一个更大的 shell,具有更多功能。
非嵌入式 Linux 系统几乎总是将 Bash 安装为/bin/bash
.因此,为了实现非嵌入式 Linux 系统上的可移植性,您可以假设 bash 可用。 bash 有用的附加功能包括数组、方便处理点文件的能力、pipestatus
获取管道中所有命令的返回状态的变量、文件时间的附加比较运算符以及(在最新版本中)正则表达式匹配。
shell 编程的特点之一是,您不仅使用程序sh
,还使用许多公用事业。 Linux 上的大多数文件操作和文本处理实用程序都是GNU 核心工具(在嵌入式系统上,它们通常来自 BusyBox)。
如果您需要 Linux 以外的可移植性,最好的选择是坚持使用 POSIX。其他 unix 变体可能没有安装 bash(bash 是 OSX 上标准安装的一部分,但在 *BSD 和大多数商业 unices 上是可选包)。几乎所有除 Linux 和 OSX 之外的 unix 变体(即 *BSD 和商业 unices)都具有某个版本的科恩壳, 至少PDKSH。 bash 的许多便捷扩展都来自 ksh,因此编写可以在两者下运行的脚本可能很有用,但检测 bash 或 ksh 在未知系统上的位置可能会有点麻烦。
外壳并不能完成所有事情。如果您需要更复杂的语言,两个更常见的选择是 Perl 和 Python(其他任何语言都远远落后于 UNIX 脚本语言)。 Perl 是传统的脚本语言,很少有非嵌入式 Linux 系统缺少它,但 Python 正在取得进展(部分原因是成为 Ubuntu 推荐的脚本语言)。在非 Linux 世界中,Perl 是 OSX 和 OpenBSD 上基本安装的一部分;它是可选的,但在 FreeBSD 上很常见安装,并且是可选的,但在 NetBSD 上经常安装。
答案2
按可用性顺序:
- sh,但坚持使用 POSIX 指定的设施。
- bash,但不要忘记在 shebang 中显式指定它,否则您可能会得到破折号。
- Python。几乎每个人都使用它。
- 珀尔。但你得写它。
在那之后,没有人真正关心,因为没有什么是你不能做的。
答案3
通常,我会说sh
……但既然你指定了 Linux,我会说bash
- 它保证存在于周围的每个 Linux 系统上(好吧,不包括那些迷恋极简主义的晦涩迂腐的小系统:)。
如果您不必关心非 Linux 的可移植性(并且不需要在小型发行版或塑料盒路由器等嵌入式 Linux 设备上运行),那么您也可以利用以下重大增强功能:它提供了普通的sh
。否则使用sh
.
在bash
(和sh
) 之后,Linux 下一个最“通用”的脚本语言将是某种方言awk
- 通常是mawk
或gawk
。如果您坚持使用普通 awk 并避免笨拙,您的脚本应该可以在几乎所有 Linux 系统上正常运行(在小型发行版或嵌入式设备上可能会丢失)。大多数 Linux 系统都有mawk
和gawk
可用,但在某些发行版(例如 debian)上默认安装,如果需要,mawk
您必须自己安装。gawk
接下来是perl
. AFAIK,所有常见的 Linux 发行版上都默认安装了基础 perl 语言,因此它是一个不错的选择。更幸运的是,与 perl5 版本几乎没有版本不兼容(尽管 perl 5.12 或者可能是 5.14 最终删除了一些已经被弃用了大约 15 年的晦涩功能......充分警告不要使用它们),所以除非您的编码风格确实很奇怪并且您喜欢忽略十多年来“不要这样做”的警告,否则您的 Perl 脚本几乎在任何地方都可以正常运行。该语言强大而强大,可以做所有可以做的事情,awk
甚至sed
更多。只需付出一点努力,它sh
也可以做传统上有益的事情(例如运行外部命令和使用/管道输出)。标准 Perl 库也非常全面——涵盖的不仅仅是基础知识。
Perl 的唯一问题是,还有一个巨大的 CPAN 模块库,几乎可以完成您能想到的任何事情(以及更多您可能永远不会想到的事情)——并且并非所有这些模块都可以在每个使用 Perl 的系统上使用。它们通常质量非常高,因此很容易养成使用它们的习惯 - 但如果您确实使用它们,则必须确保安装它们。许多 CPAN 模块是针对 Linux 预先打包的,其余模块可以使用 cpan 工具轻松安装(或者dh-make-perl
在 debian/ubuntu/etc 上将 CPAN 模块转换为 .deb 包)
我很想能说python
下一句,但我真的不能。 python 有很多值得喜欢的地方,但它在许多 Linux 系统上默认并不包含在内,而且坦率地说,它的版本兼容性(无论是 python 本身还是它所谓的“标准”库)都是一团糟。有些发行版在解决混乱方面做出了巨大的努力,而有些则不然。 python 基本上是一种由程序员(而不是系统管理员)为程序员编写的语言,而且他们似乎并不认为系统他们的代码将安装在非常重要的......他们的代码真的超级特别的因此他们不需要关心诸如集成到现有系统之类的无聊事情。
(不要从我这里的讽刺中误解 - 我真的很喜欢 python 作为一种语言,我只是讨厌版本和依赖管理是 PITA 的事实。这就像回到 20 多年前手动寻找晦涩难懂的东西的时代一些代码和补丁,以便在您专有的 *nix 上编译并运行某些内容)
答案4
我想说的是,可用性将按以下顺序排列:
- 嘘
- awk
- Perl(我还没有看到没有它的 *nix,包括 BSD)
虽然 Python 听起来像是一门不错的语言,但我没有在基本安装中使用过它附带的任何操作系统,尽管 Ubuntu 显然使用过,也许吧?