Solaris 11 上的 POSIX Awk?

Solaris 11 上的 POSIX Awk?

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

我发现在 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/awkEven 与getconf PATH.尽管还有 isnawkoawkis /usr/bin,但这些显然不是由任何地方的符号链接指向的。

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

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

就此而言,什么 nawkoawk

答案1

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

    / usr / bin / awk pkg:/系统/[电子邮件受保护]
    /usr/bin/诺克          包:/系统/[电子邮件受保护]
    /usr/bin/奥瓦克          包:/系统/[电子邮件受保护]

    /usr/gnu/bin/awk pkg:/text/[电子邮件受保护]
    /usr/bin/呆呆地          包装:/文本/[电子邮件受保护]
    /usr/bin/igawk pkg:/text/[电子邮件受保护]
    /usr/bin/pgawk pkg:/text/[电子邮件受保护]

    /usr/xpg4/bin/awk      软件包:/系统/xopen/[电子邮件受保护]

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

  • /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在环境中设置环境变量或使用选项调用时,它的目的是遵守大多数或全部 POSIX 标准,-W posix但在其他方面添加了许多特定的自己的扩展。igawkpgawk本身是 的扩展gawk,第一个支持包含文件,第二个支持分析。

另请参阅GNUawk历史篇章获取很多有用的信息。

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

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

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

如果由于某种原因您不想安装该软件包,解决方法是使用PATH包含nawkas 的“自定义” 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缺失问题。

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

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

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

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

相关内容