Shell 如何基于平台动态更改Korn(ksh)版本?
我希望尽可能在AIX和Linux上使用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将
/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 ...