这或多或少是以下两个问题的后续问题:
我发现在 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
Even 与getconf PATH
.尽管还有 isnawk
和oawk
is /usr/bin
,但这些显然不是由任何地方的符号链接指向的。
得知 Solaris 通过了 POSIX 认证,这让我感到惊讶。
如何使用也可在其他 POSIX 兼容系统上运行的可移植代码在 Solaris 11 上标准地获得 POSIX 兼容 Awk? (或者是检查nawk
或是否存在oawk
并使用其中之一(如果存在)的唯一选项?)
就此而言,什么是 nawk
和oawk
?
答案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
符合awk
1977 年发布的旧版 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
但在其他方面添加了许多特定的自己的扩展。igawk
和pgawk
本身是 的扩展gawk
,第一个支持包含文件,第二个支持分析。
另请参阅GNUawk
历史篇章获取很多有用的信息。
仅core-os
保证软件包存在于 Solaris 11 常规安装中,因此只有oawk/awk
和nawk
存在。特别是,当您创建新的非全局区域,它默认包含solaris-small-server
团体套餐所以xpg4
和 二进制文件都不gnu
awk
可用。这是设计使然。该solaris-small-server
组是一个最小的起点,您可以在其中添加应用程序正常工作所需的包。这比前一种 (Solaris 10) 方式更安全、更高效,在前一种方式中,全局区域上安装的所有内容也都安装在非全局区域上,因此当您想要最小化区域时,必须删除未使用的软件包。
要awk
在这样的“小型服务器”安装中以可移植的方式获得 POSIX 支持,您需要安装该xcu4
软件包并将 PATH 设置为符合 POSIX 的软件包:
pkg install xcu4
PATH=$(getconf PATH):$PATH
如果由于某种原因您不想安装该软件包,解决方法是使用PATH
包含nawk
as 的“自定义” 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