哪一种是sed,awk,perl和sh中最便于移植的?


15

有人可以按可移植性顺序放置这些工具吗?即使在最小的* nix系统上,肯定可以找到其中的哪一个?是否肯定有100%存在?我的猜测是顺序如下:

  1. awk
  2. sed
  3. SH
  4. 佩尔

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


嵌入式系统通常会牺牲可移植性以保持最小。许多不符合POSIX。
jordanm 2014年

@jordanm这是否意味着他们可能被认为不具有任何的这些?我假设系统至少提供最小的外壳接口。我知道busybox的提供shawk以及sed例如,我的基于BusyBox的NAS也有perl的。
terdon

1
您可能拥有它们,但是它们的作用在不同的系统中会有所不同,因此,这个问题并没有太大的意义。
斯特凡Chazelas

@StephaneChazelas啊,那你能帮我缩小范围吗?是否有可能根据在系统X上找到它们的可能性对它们进行排序?我的经验严格是Linux和几个嵌入式NAS系统。我知道如果没有这四个要素,您将永远无法获得GNU / Linux,但是您不能让我知道其中哪一个是最安全的吗?
terdon

Answers:


15

哪一种是sed,awk,perl和sh中最便于移植的?

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

有人可以按可移植性顺序放置这些工具吗?

如果您遵循兼容的代码,则三个POSIX命令的可移植性顺序应该没有顺序。

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

对于要成为POSIX的操作系统,这三个POSIX以及许多其他实用程序是必需的。但是,由于存在最小化或提供不完整/不符合标准的实现,因此缺少某些操作系统的确存在。

实际上,大多数(如果不是全部的话)像操作系统那样的免费和开源Unix操作系统,如果他们尝试这样做,可能就不会通过一致性过程,而且他们也从不尝试。

是否肯定有100%存在?

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

我的猜测是顺序如下:某些shell将作为默认值存在,是否始终位于/ bin / sh?

/bin/sh可能是Bourne语法系列外壳程序,但不能保证与POSIX兼容,甚至不能与POSIX兼容。例如,它/usr/xpg4/bin/sh在Solaris 10及更早版本上,而/bin/sh旧的原始Bourne shell不是POSIX。


12

从Autotools中得到一个提示:sed如果必须编写必须在所有地方都可以使用的东西,则坚持使用Bourne和POSIX shell的最小公分母(可能会增加)。可能存在某些系统中断,但是您可以通过重写解决这些问题。

例如,某些古老的系统在testaka中存在扩展错误的问题[

 if [ $foo = bar ] ; then...

因此,Autoconf的做法是用一个字符前缀用双引号将其重写,如下所示:

 if [ x"$foo" = "xbar" ] ; then...

您也可以"x$foo"在这里使用。这避免了可能$foo是的有效选项的可能性test(1),并且由于[是的别名test,因此可能会误解表达式。解决方案是建立一种情况,其中to [始终是未知参数的开头x,这意味着它对[

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

awk是POSIX,因此从理论上讲,它随处可见。它甚至在Busybox中也是如此,因此awk即使在某些限制性很强的嵌入式Linux系统中,您也可以实现。不过,我会碰到一个系统,而无需惊讶少awksed。我想这归结为复杂性:更简单的工具更有可能幸免于难。

Perl不属于任何广泛使用的标准(POSIX或其他标准)的一部分,因此,如果您事先对目标环境一无所知,则根本无法依靠它。默认情况下,未安装Perl:

  • 西格温
  • FreeBSD和NetBSD
  • 对于某些Linux,包括Slackware,“最小”安装
  • 许多主要依赖Busybox的用户领域的嵌入式Linux

Autoconf手册中有一章是有关可移植Shell编程的,对您有帮助。最后一节介绍的工具一样sedawk和其他许多人。


谢谢,但是我想知道它们的可移植性顺序。如果我没看错,则表示您建议这样做,sh并且sed携带最方便。好,还有什么?而且是sh真的那么便携?如果默认外壳是C外壳派生怎么办?这样的系统还会存在符号链接/bin/sh吗?
terdon

感谢您的编辑,这虽然事情,都sedawk由busybox的提供,为什么你会更惊讶地发现sed没有?您是否知道busybox替代方案还提供sed和awk?
terdon

回复:POSIX vs Bourne shell,改写了忠告于两者的LCD。Re:test quoting,我记错了原因,但在Autoconf手册中找到了涵盖该原因的章节,并相应地编辑了答案。回复:sed vs awk和Busybox,我解释说:更大的复杂性和分类。sed它做的更少,因此它的二进制文件会更小,因此删除它的理由比少awk,这非常复杂。(我的系统上为20 kiB,而我的系统上为48 kiB。)Re:Busybox的替代品,我不知道其他任何一站式购物替代品。
沃伦·杨

+1是因为我同意您在这里的一般前提(最低公分母将是某种sh-terdon在此o_O之上awk并且很奇怪sed?),尽管这只是与Autotool的目的相吻合,因为某些环境,尤其是小环境,可能不适用于建筑物,时期。
goldilocks 2014年

1
@WarrenYoung这就是我想知道的事情。我不知道默认情况下是否所有* nix系统实际上都安装了bourne shell。如果它们都具有/bin/sh,则情况会有所不同,但我不知道它们都将具有一个。抱歉,我不接受这一点,我在您的回答和jlliagre的回答之间感到困惑,两者都回答了我的问题。我之所以选择他,是因为它可以更直接地解决这个问题,并且因为他的代表人数少:)。
terdon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.