Solaris 11上的POSIX Awk?


13

这或多或少是以下两个问题的跟进问题:

我看到在Solaris 10(SunOS 5.10)上,我得到以下结果:

$ type -a awk
awk is /usr/bin/awk
$ PATH="$(getconf PATH)" type -a awk
awk is /usr/xpg4/bin/awk
awk is /usr/bin/awk
$

在Solaris 10上,/usr/bin/awk不接受POSIX标准awk中语法如'!x[$0]++',但/usr/xpg4/bin/awk确实。到目前为止足够好了。

但是,在Solaris 11上,/usr/bin/awk甚至只有getconf PATH。虽然也有nawkoawk/usr/bin,这些显然都没有指出,一些从任何地方符号链接。

知道Solaris已获得POSIX认证,这使我感到惊讶。

如何使用可移植代码在Solaris 11上标准地获得与POSIX兼容的Awk,这些代码也可以在其他与POSIX兼容的系统上工作?(或者是检查nawkor 是否存在oawk并使用其中一个(如果存在)的唯一选择?)

因此,什么 nawkoawk


/usr/xpg4/bin/awk是不是在Solaris 11中?nawk是“新的awk”,是改进的AT&T awk
库萨兰达


@StéphaneChazelasAFAIK,只有完整的操作系统安装才经过测试,并符合要求。
jlliagre

@jlliagre,它不能是完整的OS(安装了所有可选软件包的OS),因为这是不实际的(也有相互排斥的软件包),必须定义“可选软件包”的范围。
斯特凡Chazelas

@StéphaneChazelas是的。尽管Solaris 10具有整个分发的概念并有效地安装了所有软件包(未选择的语言环境之外的软件包),但是Solaris 11不再是这种情况。我的最佳猜测是“ solaris-large-server”组用于POSIX遵从性测试。
jlliagre

Answers:


19

在完整或桌面Solaris 11安装上,有三种 awk可用的实现,以及一些变体:

    / usr / bin / awk pkg:/system/core-os@0.5.11-0.175.3.1.0.2.0
    / usr / bin / nawk           pkg:/system/core-os@0.5.11-0.175.3.1.0.2.0
    / usr / bin / oawk           pkg:/system/core-os@0.5.11-0.175.3.1.0.2.0

    / usr / gnu / bin / awk pkg:/text/gawk@3.1.8-0.175.3.0.0.30.0
    / usr / bin / gawk           pkg:/text/gawk@3.1.8-0.175.3.0.0.30.0
    / usr / bin / igawk pkg:/text/gawk@3.1.8-0.175.3.0.0.30.0
    / usr / bin / pgawk pkg:/text/gawk@3.1.8-0.175.3.0.0.30.0

    / usr / xpg4 / bin / awk       pkg:/system/xopen/xcu4@0.5.11-0.175.3.0.0.30.0

它们都“符合标准”,尽管符合不同的标准。

  • /usr/bin/awk遵循awk1977年发布的旧版UNIX 实现。它保留在默认系统PATH中,不破坏现有脚本,因为后续awk版本破坏了兼容性。oawk是...的同义词awk

  • /usr/bin/nawk是的“新”版本awk,于1986年首次在SVR3.1中发布。POSIX Awk标准基于此实现。/usr/xpg4/bin/awk与前者几乎相同,但已针对POSIX一致性验证测试进行了正式检查。

  • /usr/gnu/bin/awk,也是/usr/bin/gawk的GNU变体awk。当在环境POSIXLY_CORRECT中设置环境变量或使用该-W posix选项调用环境变量时,它旨在符合大多数或所有POSIX标准,否则将添加许多特定的自身扩展。igawk并且pgawk本身就是的扩展gawk,第一个支持包括文件,第二个支持分析。

有关许多有用的信息,另请参见GNU awk历史一章

只有core-os封装,保证是目前在Solaris 11常规安装,因此只oawk/awknawk在那里。特别是,当您创建一个新的非全局区域时,默认情况下它将包含solaris-small-server组包,因此二进制xpg4gnu awk二进制都不可用。这是设计使然。该solaris-small-server组是最小的起点,您可以在其中添加必需的程序包以使应用程序正常工作。这比以前的(Solaris 10)方法更安全和有效,在以前的方法中,全局区域中安装的所有内容也都安装在非全局区域中,因此,当您要最小化区域时,必须删除未使用的软件包。

为了awk在这种“小型服务器”安装中以一种可移植的方式获得POSIX 支持,您需要安装该xcu4软件包并将PATH设置为符合POSIX 的软件包:

pkg install xcu4
PATH=$(getconf PATH):$PATH

如果出于某种原因您不想安装该软件包,一种解决方法是使用PATH包含nawkas 的“ custom” awk,例如:

mkdir -p /opt/posix/bin
cp /usr/bin/nawk /opt/posix/bin/awk
PATH=/opt/posix/bin:$PATH

或者,您可以安装GNU awk并设置PATH为首先获取它:

pkg install gawk
PATH=/usr/gnu/bin:$PATH

请注意,这不是特定于Solaris 11的。在Solaris 10及更早版本中已经存在类似的软件包分组,并且POSIX兼容实用程序仅安装在“最终用户”,“开发人员”和“完整安装”元群集中。如果安装了带有“核心”或“网络支持”元集群的系统或区域,则会导致同样的xpg4丢失问题。

还请注意,/usr/xpg4/bin/awkSolaris 11系统中缺少并不是POSIX合规性失败。Oracle和ISV执行的绝大多数测试(包括Open Group认证计划)仅使用完整的Solaris安装。支持简化安装,但不符合要求

如果您分发Solaris 11的外壳程序脚本(或嵌入外壳程序脚本/调用外壳程序命令的应用程序),则只需要/system/xopen/xcu4在其IPS软件包中定义为依赖项,安装程序将自动执行脚本正常工作所需的操作:

depend fmri=pkg:/system/xopen/xcu4 type=require

参见https://docs.oracle.com/cd/E53394_01/html/E54820/dependtypes.html


3
缺少POSIX兼容的awk是POSIX一致性失败。没有POSIX兼容awk的系统不能运行POSIX兼容脚本。那些小型的服务器服务器不是POSIX,更不用说Unix系统了。我想它们不属于从Open Group获得的Solaris证书。
斯特凡Chazelas

1
@StéphaneChazelas是的,这些系统不合格,因此显然不包含在内。如果将Solaris安装在不合格的硬件上,也会发生同样的情况。POSIX / Unix兼容性不是Solaris正常运行的先决条件。当Solaris实用程序与自己的实用程序不同时,Solaris本身不使用POSIX实用程序。
jlliagre

@StéphaneChazelas在任何情况下,POSIX awk始终存在于Solaris系统或非全局区域中,因此问题不在于可用性,而是限于命令名(nawkvs awk)。docs.oracle.com/cd/E53394_01/html/E54763/nawk-1.html
jlliagre

1
nawk几乎是POSIX(CONVFMT例如不支持),但是是的,至少还不如grep(没有POSIX -e/ -E)或tr(没有tr a-f A-F)那么糟糕。
斯特凡Chazelas

@StéphaneChazelas的确,我的回复中添加了澄清。谢谢。
jlliagre
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.