Linux 最通用的脚本语言是?

23 linux shell scripting portability

我们正在为 Linux 系统编写脚本,关于什么是最普遍使用的 Linux 脚本语言存在一些争论。Bash,SH,Posix?什么?

Gil*_*il' 38

每个类 Unix 操作系统上都有两种编程环境,它们是图灵完备的并且能够调用其他程序:awksh,即 Bourne/POSIX shell 系列。AWK 面向文本处理(它补充了更专业的实用程序),而 sh 面向成为将程序组合在一起的胶水语言。Sh 是Linux 和整个 unix 世界通用脚本语言。

POSIX标准定义的sh本身和相关的设施的强制特征。大多数类 Unix 系统符合POSIX 1003.1-2004(又名 Single Unix v3,又名 Open Group Base Specification issue 6);该标准的最新版本是POSIX 1003.1-2008(又名 Single Unix v4,又名 Open Group Base Specification Issue 7)。

每个 Linux 和 unix 或类 Unix 系统在 path 处都有一个 Bourne 风格的 shell /bin/sh,任何非古董系统都有一个 POSIX 兼容的 shell(除非偶尔出现错误)。每个现代类 Unix 系统(包括 Linux)都支持shebangs,因此/bin/sh如果第一行是#!/bin/sh. 有sh位于另一个地方的POSIX 系统(通常是操作系统上的仿真层,您不会认为它是真正的类 Unix)。

嵌入式 Linux 系统可能有一个精简的BusyBox系统,它没有实现所有 POSIX 功能。BusyBox 有大量编译时选项来适应小规模系统,因此很难提前知道会发生什么,您必须针对特定设备定制脚本。BusyBox 是 sh 和各种实用程序的最常见的小规模实现;您可能会遇到的另一个问题是 Android 中极其精简的 shell 环境(以后的版本不那么乏味了)。

非嵌入式 Linux 系统几乎总是将dashbash作为/bin/sh. Dash 是一个小而快速的 shell,它实现了比 POSIX 功能更多的功能。Bash 是一个更大的外壳,具有更多的功能。

非嵌入式 Linux 系统几乎总是将 Bash 安装为/bin/bash. 因此,为了在非嵌入式 Linux 系统上具有可移植性,您可以假设 bash 可用。bash 有用的附加功能包括数组、方便地处理点文件的能力、pipestatus获取管道中所有命令的返回状态的变量、文件时间的附加比较运算符以及(在最近版本中)正则表达式匹配.

shell 编程的特征之一是您不仅在使用sh程序,而且还在使用许多实用程序。Linux 上的大多数文件操作和文本处理实用程序是GNU coreutils(在嵌入式系统上,它们通常来自 BusyBox)。

如果您需要 Linux 以外的可移植性,最好的选择是坚持使用 POSIX。其他 unix 变体可能没有安装 bash(bash 是 OSX 上标准安装的一部分,但在 *BSD 和大多数商业 unices 上是一个可选包)。除了 Linux 和 OSX(即 *BSD 和商业 unices)之外,几乎所有的 unix 变体都有一些Korn shell版本,至少是pdksh。bash 的许多方便的扩展都来自 ksh,因此编写可以在两者下运行的脚本会很有用,但是检测 bash 或 ksh 在未知系统上的位置可能有点麻烦。

外壳不能做所有事情。如果您需要更复杂的语言,那么两个更常见的选择是 Perl 和 Python(任何其他语言都远远落后于 Unix 脚本语言)。Perl 是传统的脚本语言,很少有非嵌入式 Linux 系统缺少它,但 Python 正在取得进展(部分原因是因为它成为 Ubuntu 的推荐脚本语言)。在非 Linux 世界中,Perl 是 OSX 和 OpenBSD 上基本安装的一部分;它是可选的,但通常安装在 FreeBSD 上,可选但通常安装在 NetBSD 上。

  • 不过,一个公平的警告——FreeBSD 不久前从他们的默认安装中删除了 Perl。除此之外,我不知道任何其他发行版在其基本安装中没有 Perl。 (2认同)

Ign*_*ams 11

按可用性顺序:

  1. sh,但坚持使用 POSIX 指定的设施。
  2. bash,但不要忘记在shebang中明确指定它,否则你可能会得到破折号。
  3. Python。几乎每个人都在使用它。
  4. 珀尔。但是你得写。

在那之后,没有人真正关心,因为只有这些你不能做的事情不多。

  • 我将 PERL 放在 python 之前,它默认安装在大多数 linux 系统中。 (12认同)
  • Perl 是#3。*和*你可以写它,奖金!:) (6认同)
  • @ashwin:不,python 不是 perl 的演变,甚至不是 perl 的演变。perl 是系统管理员为系统管理员编写的一种语言。python是程序员为程序员设计的一种语言。这种差异至关重要。它们都有自己的用途,虽然在用例中可能有很多重叠,但对于某些任务,perl 是更好的选择,而对于其他任务,python 显然更胜一筹。 (6认同)
  • 我同意@ignacio perl 是#4,python 是#3。原因很明显。我认为 Python 是 perl 的演变。 (2认同)

cas*_*cas 5

通常,我会说sh……但既然你指定了 Linux,我会说bash- 它保证存在于周围的每个 Linux 系统上(好吧,不包括那些迷恋极简主义的晦涩迂腐的小系统:)。

如果您不必关心非 Linux 的可移植性(并且不需要在小型发行版或塑料盒路由器等嵌入式 Linux 设备上运行),那么您也可以利用以下重大增强功能:它提供了普通的sh。否则使用sh.

bash在(和)之后sh,Linux 下一个最“通用”的脚本语言将是某种方言awk- 通常是mawkgawk。如果您坚持使用普通 awk 并避免笨拙,您的脚本应该可以在几乎所有 Linux 系统上正常运行(在小型发行版或嵌入式设备上可能会丢失)。大多数 Linux 系统都有mawkgawk可用,但在某些发行版(例如 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 上编译并运行某些内容)


dub*_*jim 0

不是重击。写入接近 POSIX sh 的内容,如 dash 或 ash。这将是最普遍的。我认为没有其他任何东西可以与它相媲美。(在我看来,这似乎是一个事实问题,而不是一位评论者抱怨的“意见”。)

如果您需要比 sh 更强大的东西(例如,如果您想要真正的关联数组),请使用 awk。(避免 gawk 扩展。awk 有很多版本,但有一个很大程度上共享的核心。)它应该几乎与 sh 一样广泛可用。

  • @WilliamPursell bash 软件包在 Debian 上被标记为 Essential(即您必须费尽周折才能卸载,并有足够的警告表明这将破坏您的系统)。Bash 在非嵌入式 Linux 系统上几乎是通用的。 (6认同)
  • 哪些 Linux 变体不支持 `bash`? (5认同)