23 linux shell scripting portability
我们正在为 Linux 系统编写脚本,关于什么是最普遍使用的 Linux 脚本语言存在一些争论。Bash,SH,Posix?什么?
Gil*_*il' 38
每个类 Unix 操作系统上都有两种编程环境,它们是图灵完备的并且能够调用其他程序:awk和sh,即 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 系统几乎总是将dash或bash作为/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 上。
Ign*_*ams 11
按可用性顺序:
在那之后,没有人真正关心,因为只有这些你不能做的事情不多。
通常,我会说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 上编译并运行某些内容)
不是重击。写入接近 POSIX sh 的内容,如 dash 或 ash。这将是最普遍的。我认为没有其他任何东西可以与它相媲美。(在我看来,这似乎是一个事实问题,而不是一位评论者抱怨的“意见”。)
如果您需要比 sh 更强大的东西(例如,如果您想要真正的关联数组),请使用 awk。(避免 gawk 扩展。awk 有很多版本,但有一个很大程度上共享的核心。)它应该几乎与 sh 一样广泛可用。
| 归档时间: |
|
| 查看次数: |
9170 次 |
| 最近记录: |