如何根据平台动态更改 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
,但是当那个已经存在并且版本错误时你会被卡住。
由于 ksh
和 sh
有一些共同的语法,您可以在
在 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。
我想在 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
,但是当那个已经存在并且版本错误时你会被卡住。
由于 ksh
和 sh
有一些共同的语法,您可以在
在 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。