Solaris 11 上的 POSIX awk?

Wil*_*ard 13 solaris awk posix

这或多或少是以下两个问题的后续问题:

我看到在 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
$
Run Code Online (Sandbox Code Playgroud)

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

但是,在 Solaris 11 上,/usr/bin/awk甚至只有getconf PATH. 虽然还有nawkand oawkis /usr/bin,但显然没有任何地方的符号链接指向这些。

知道 Solaris 已通过 POSIX 认证,这让我感到惊讶。

如何使用可在其他 POSIX 兼容系统上运行的可移植代码在 Solaris 11 上标准地获得兼容 POSIX 的 Awk?(或者是检查是否存在nawkoawk使用其中之一(如果存在)的唯一选择?)

就此而言,什么 nawkoawk

jll*_*gre 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 中发布。POSIXAwk标准基于此实现。/usr/xpg4/bin/awk几乎与前者相同,但后者是针对 POSIX 一致性验证测试进行正式检查的。

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

另请参阅GNUawk历史章节以获取许多有用的信息。

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

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

pkg install xcu4
PATH=$(getconf PATH):$PATH
Run Code Online (Sandbox Code Playgroud)

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

mkdir -p /opt/posix/bin
cp /usr/bin/nawk /opt/posix/bin/awk
PATH=/opt/posix/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

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

pkg install gawk
PATH=/usr/gnu/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

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

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

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

depend fmri=pkg:/system/xopen/xcu4 type=require
Run Code Online (Sandbox Code Playgroud)

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

  • 缺少符合 POSIX 的 awk 是 POSIX 符合性失败。没有符合 POSIX 的 awk 的系统不能运行符合 POSIX 的脚本。那些小型solaris-server 不是POSIX,更不用说Unix 系统了。而且我想它们没有包含在从 Open Group 获得的证书 Solaris 中。 (3认同)