如何基于平台动态更改Korn(ksh)版本?

时间:2015-07-01 16:54:46

标签: shell unix posix ksh shebang

我希望尽可能在AIX和Linux上使用/usr/bin/ksh93解释器,但切换到不适用的/usr/bin/ksh,如Mac OS X,并希望脚本在unix中普遍兼容。我不认为shebang有任何后备机制

2 个答案:

答案 0 :(得分:2)

由于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   $0 "$@"
     else    exec ksh93 $0 "$@"
     fi
fi
... rest of your script ...

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

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

或者,您可以使用您控制的任何固定路径替换#!行,例如#!/home/user/myksh,并将该文件链接到正确的ksh。

答案 1 :(得分:0)

您可以制作符号链接。

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,但是当它已经存在并且版本错误时你会被卡住。