sed、awk、perl 和 sh 哪个最便携?

ter*_*don 15 posix portability

有人可以按照可移植性的顺序排列这些工具吗?即使在最小的 *nix 系统上也肯定可以找到其中的哪些?他们中的任何一个100%肯定存在吗?我的猜测是顺序如下:

  1. awk
  2. sed
  3. perl

虽然我想象有些系统不默认为 bourne shell,但某些shell 将作为默认值存在,它总是在/bin/sh? 如果它不是伯恩型外壳,大概不会。双方awksed有解释他们对POSIX规范的页面所以想必他们将始终存在。是这样吗?我可以确定两者都将安装在任何 *nix 上吗?包括嵌入式系统?

jll*_*gre 15

sed、awk、perl 和 sh 哪个最便携?

sedsh并且awk是由 POSIX 指定的可移植性,perl并不是没有标准支持。

有人可以按照可移植性的顺序排列这些工具吗?

如果您坚持使用兼容代码,那么三个 POSIX 命令的可移植性应该没有顺序。

即使在最小的 *nix 系统上也肯定可以找到其中的哪些?

三个 POSIX 以及许多其他实用程序对于 OS 是 POSIX 是强制性的。但是,由于最小化或提供不完整/不符合标准的实现而缺少其中一些的操作系统确实存在。

实际上,大多数(如果不是全部)像操作系统一样的免费和开源 Unix 可能不会通过一致性过程,如果他们尝试,他们永远不会尝试。

他们中的任何一个100%肯定存在吗?

我会惊讶地发现像 OS 这样的 *nix 缺少基于 Bourne 语法的 shell,但一切皆有可能,尤其是对于嵌入式系统。

我的猜测是顺序如下:一些 shell 将作为默认值存在,它总是在 /bin/sh 吗?

/bin/sh可能是 Bourne 语法家族 shell,但不能保证符合 POSIX,即使是符合 POSIX 的系统。例如,它/usr/xpg4/bin/sh在 Solaris 10 及更早版本上,而/bin/sh在不是 POSIX 的遗留原始 Bourne shell 上。


War*_*ung 12

从 Autotools 得到一个提示:坚持 Bourne 和 POSIX shell 的最小公分母sed——如果你必须写一些必须在任何地方都能工作的东西,可能会增加。可能存在某些系统出现故障的情况,但您可以通过重写来解决此类问题。

例如,一些古老的系统在 中存在扩展错误的问题test,也就是[

 if [ $foo = bar ] ; then...
Run Code Online (Sandbox Code Playgroud)

所以Autoconf 的做法是用单字符前缀用双引号重写它,如下所示:

 if [ x"$foo" = "xbar" ] ; then...
Run Code Online (Sandbox Code Playgroud)

你也可以"x$foo"在这里使用。这$foo可以防止可能成为 的有效选项的可能性test(1),并且由于[是 的别名test,因此可能会误解该表达式。解决方案是设置一个情况,其中未知参数 to[总是以 开头x,这意味着它不能有特殊含义 to [

(Autoconf 还建议使用test代替[,但该建议是对可能与M4冲突的反应,它也在[其语法中使用。)

awk 是 POSIX,所以理论上它无处不在。它甚至在 Busybox 中,因此awk即使在一些非常严格的嵌入式 Linux 系统中,您也可以实现。不过,我会碰到一个系统,而无需惊讶少awksed。我想这归结为复杂性:更简单的工具更有可能在激进的分类中幸存下来。

Perl 不是任何广泛使用的标准、POSIX 或其他标准的一部分,因此如果您事先对目标环境一无所知,就不能指望它。Perl 默认没有安装在:

  • 赛格温
  • FreeBSD 和 NetBSD
  • 一些 Linux 的“最小”安装,包括 Slackware
  • 许多嵌入式 Linux 主要依赖 Busybox 为其用户空间

Autoconf 手册有一章关于可移植的 shell 编程,这应该对您有所帮助。最后一节介绍的工具一样sedawk和其他许多人。