何时使用 XPG* 版本的命令?

何时使用 XPG* 版本的命令?

我偶尔会在一台较旧的 Solaris 机器上工作,其默认版本grep不是符合 POSIX 标准。这会导致我的 rc 文件出现问题,因为grep机器上的默认设置不支持我需要的选项。

这是我工作场所的一台机器,我不是管理员;所以我不能只安装我认为合适的更新/更好版本的命令。然而,我注意到这台机器确实有一个合适的XPGgrep的版本/usr/xpg4/bin/grep

显然,我可以使用以下命令解决 rc 文件中的问题(对于 Solaris):

alias grep='/usr/xpg4/bin/grep'

但是对于不需要这样做的机器呢?我的目标是为每个 shell 提供一个 rc 文件,我可以将其放入任何类 Unix 系统中并让它正常工作。

这让我思考...

  1. 有没有一种情况我不想使用XPG命令的版本?
    • 如果是的话,什么时候?
  2. 难道我不能盲目地在所有机器上的 rc 文件/usr/xpg4/bin/的开头添加$PATH并放弃将各个命令别名为其 XPG* 版本吗?
    • 或者这会导致某些命令出现问题吗?
  3. 难道这种情况/usr/xpg4/bin/只存在于“有必要”的机器上吗?
    • 我问这个问题是因为我注意到/usr/xpg4/bin/我的 Ubuntu 机器上不存在这个。

总而言之,这是一个好主意吗?

if [ -d "/usr/xpg4/bin" ]; then
  #Place XPG directory at beginning of path to always use XPG version of commands
  export PATH="/usr/xpg4/bin:$PATH"
fi

如果没有,为什么不呢?

答案1

/bin一些商业 Unix 系统在和中具有向后兼容的实用程序,以及一个包含 POSIX 兼容实用程序/usr/bin的目录。/usr/xpg4/bin这样,旧的应用程序可以PATH仅使用/bin和来坚持旧的应用程序/usr/bin,而较新的应用程序PATH首先使用 POSIX 实用程序。除非您需要与 Unix 系统中的 20 世纪 80 年代实用程序向后兼容,否则使用 POSIX 实用程序会更好。

在 my 中.profile,我将以下目录放在/bin和之前/usr/bin(如果存在):

/bin/posix
/usr/bin/posix
/usr/xpg6/bin
/usr/xpg4/bin
/usr/xpg2/bin

我认为这至少涵盖了 Solaris、Tru64(又名 Digital Unix,又名 OSF/1)和 HP-UX。

您应该能够PATH通过调用来找到适合 POSIX 依赖的应用程序,而不是自动确定 PATHgetconf公用事业:

PATH=$(getconf PATH)

某些系统(例如 *BSD 和 Linux)仅提供 POSIX 兼容的实用程序,因此它们位于常用目录 ( /bin/usr/bin) 中,不需要任何单独的目录。

答案2

第一的,使用alias您在问题中描述的版本;这肯定是你拥有的最糟糕的选择。还附加针对所有平台硬编码的 XPG4 路径。

索拉里斯/usr/xpg4/bin如果您在PATH其他系统目录之前定义,通常会得到更好的服务(至少可以这么说)bin。我敢说 XPG4 标准版本的工具通常是该平台上更好的选择。 (另一个突出的例子是awkSolaris 上的“损坏”。)我当然建议PATH仅针对 Solaris 平台定义此 XPG4;这样您就可以询问该平台并有条件地将其设置在您的个人资料中。

我可能会针对 的输出进行测试uname,但我也没有看到/usr/xpg4/bin像您那样测试目录是否存在的问题。

答案3

如果 POSIX.2、POSIX.2a、XPG4、SUSv2 标准所需的行为与历史 Solaris 实用程序行为相冲突,则该实用程序的原始 Solaris 版本将保持不变;中提供了符合标准的新版本/usr/xpg4/bin。如果 POSIX.1-2001 或 SUSv3 需要该行为,/usr/xpg4/bin则 或中提供了符合标准的新版本/usr/xpg6/bin。中提供了符合 SUSv3 标准的新版本/usr/xpg6/bin

想要使用符合标准的实用程序的应用程序必须设置PATH(sh(1)ksh(1)) 或path( csh(1)) 环境变量来指定适当的文件夹。

答案4

根据所使用的 shell,您可能有一个可以测试的参数;就像OSTYPE,在里面填充操作系统特定的东西。

if [[ $OSTYPE == solaris* ]]; then
  here be dragons
fi

或者如果您有几个不同的操作系统

case $OSTYPE in
  freebsd*|solaris*)
    export MANWIDTH=tty
  ;;
  openbsd*)
    export "PKG_PATH=http://mirror.team-cymru.org/pub/OpenBSD/$(uname -r)/packages/$(uname -p)"
  ;;
esac

相关内容