我偶尔会在一台较旧的 Solaris 机器上工作,其默认版本grep
不是符合 POSIX 标准。这会导致我的 rc 文件出现问题,因为grep
机器上的默认设置不支持我需要的选项。
这是我工作场所的一台机器,我不是管理员;所以我不能只安装我认为合适的更新/更好版本的命令。然而,我注意到这台机器确实有一个合适的XPGgrep
的版本/usr/xpg4/bin/grep
。
显然,我可以使用以下命令解决 rc 文件中的问题(对于 Solaris):
alias grep='/usr/xpg4/bin/grep'
但是对于不需要这样做的机器呢?我的目标是为每个 shell 提供一个 rc 文件,我可以将其放入任何类 Unix 系统中并让它正常工作。
这让我思考...
- 有没有一种情况我不想使用XPG命令的版本?
- 如果是的话,什么时候?
- 难道我不能盲目地在所有机器上的 rc 文件
/usr/xpg4/bin/
的开头添加$PATH
并放弃将各个命令别名为其 XPG* 版本吗?- 或者这会导致某些命令出现问题吗?
- 难道这种情况
/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 标准版本的工具通常是该平台上更好的选择。 (另一个突出的例子是awk
Solaris 上的“损坏”。)我当然建议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