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

Shell 如何基于平台动态更改Korn(ksh)版本?,shell,unix,posix,ksh,shebang,Shell,Unix,Posix,Ksh,Shebang,我希望尽可能在AIX和Linux上使用/usr/bin/ksh93解释器,但在与Mac OS X不适用的地方切换到/usr/bin/ksh,并希望脚本在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将

我希望尽可能在AIX和Linux上使用
/usr/bin/ksh93
解释器,但在与Mac OS X不适用的地方切换到
/usr/bin/ksh
,并希望脚本在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
,但当该版本已经存在并且是错误的版本时,您将被卡住。

由于
ksh
sh
有一些共同的语法,您可以在 使用路径中的ksh或ksh93测试脚本,并使用 正确的翻译。更换#!路径名为sh 这在两台机器上都是一样的,或者你回到了你开始的地方。你可以 如果您的环境能为您找到路径,请仍然尝试
#!/usr/bin/env sh
)。加:

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

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


或者,您可以替换
##,编码>行/home/user/myksh
,并将该文件链接到正确的ksh。

现在要创建可移植脚本吗?用她砰的一声/bin/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 ...