如何根据平台动态更改 Korn(ksh) 版本?

How do I change Korn(ksh) version dynamically based on platform?

我想在 AIX 上使用 /usr/bin/ksh93 解释器,并尽可能使用 Linux,但在不适用的情况下切换到 /usr/bin/ksh,例如 Mac OS X并希望脚本在 unix 中普遍兼容。我认为 shebang

中没有任何后备机制

你可以做一个符号链接。

if [ -f /usr/bin/ksh93 ]; then
   ln -s /usr/bin/ksh93 /usr/bin/localksh 
else
   ln -s /usr/bin/ksh /usr/bin/localksh 
fi

shebang 将是 #!/usr/bin/localksh
我更喜欢使用普通的 shebang #!/bin/ksh,但是当那个已经存在并且版本错误时你会被卡住。

由于 kshsh 有一些共同的语法,您可以在 在 PATH 中测试 ksh 或 ksh93 的脚本,然后重新运行脚本 合适的口译员。更换 #!带有 sh 的路径名。 (希望 它在两台机器上都是一样的,或者你回到了你开始的地方。你可以 如果您的环境会为您找到路径,请仍然尝试 #!/usr/bin/env sh)。添加:

#!/bin/sh
if [ "$DONEIT" != true ]
then export DONEIT=true # avoid recursion
     if command -v ksh > /dev/null 2>&1
     then    exec ksh   [=10=] "$@"
     else    exec ksh93 [=10=] "$@"
     fi
fi
... rest of your script ...

注意:command -v 是 POSIX 查找命令路径的方法。

(通常在这些情况下,在安装包时脚本会 通过 #!文件并将解释器路径更新为所需的路径 目标机器)。

或者,您可以将 #! 行替换为您控制的任何固定路径,例如 #!/home/user/myksh,然后 link 该文件到右侧 ksh。