korn vs bash 退出代码
Posted
技术标签:
【中文标题】korn vs bash 退出代码【英文标题】:korn vs bash exit code 【发布时间】:2012-06-01 07:50:31 【问题描述】:我有以下问题:
我有一些以前使用 ksh 运行的测试脚本(来自 MKS Toolkit) 脚本需要保持不变(不会更改单个字符)。 我将使用 bash(来自 Mingw/Msys)来运行这些脚本。问题出在以下几点:
这在 KornShell (ksh) 中工作正常,但在 bash 中不起作用:
typeset -i errorCode
errorCode=10
exit errorCode
我需要像这样修改脚本(注意 $ 符号):
typeset -i errorCode
errorCode=10
exit $errorCode
有没有办法让代码可以用 bash 编译,而无需进行我提到的 chnage?
谢谢
【问题讨论】:
在exit
语句中的变量上没有美元符号的情况下,没有我可以访问的 ksh 或其变体版本。 Ksh 93 将其视为 0,mksh
和 pdksh
抱怨这是一个“坏数字”。它必须特定于 MKS 工具包中的 ksh 版本。
@DennisWilliamson 是的,它是来自 mks 的 ksh
【参考方案1】:
假设您的代码位于名为 foo.sh 的文件中,您可以使用进程替换来包装它。例如:
bash <(sed 's/errorCode$/$&/' foo.sh)
Bash 将修改后的代码解释为从文件描述符中读取,并且子shell 的退出状态按预期设置。
$ echo $?
10
【讨论】:
哇,好一个!很高兴每天都能学到一些东西。祝大家好运。【参考方案2】:您也可以在 bash 中执行 ksh 脚本之前执行此操作
#!/bin/bash
exit ()
unset -f exit
if expr match "$1" '^[-|+|0-9|.][.0-9]*$' &> /dev/null ; then
exit "$1"
fi
exit
source ./the_ksh_script
覆盖退出。 此示例与原始代码兼容,即给出的退出代码为 0。
第二个例子
exit ()
unset -f exit
eval rc2=\$$1
rc1=$1
for rc in "$rc1" "$rc2"
do
if expr match "$rc" '^[-|+|0-9|.][.0-9]*$' &> /dev/null ; then
exit "$rc"
fi
done
exit
source ./the_ksh_script
将产生退出代码 10,这可能是原始脚本的意图。
【讨论】:
好的,我理解你的例子;但我如何找到退出代码?因为我需要它 您原来的 ksh 代码退出错误代码实际上在 ksh 下运行时给出了退出代码 0,这不是您想要的吗?或者您希望 errorCode 中的实际值是退出代码。我认为原始代码有一个错误,它只是不会在 ksh 下产生错误。所以这个例子和原来的 ksh 是兼容的。 关于返回码为 0 的部分......我担心 MKS 的这个 ksh shell 也可以与exit intName
一起使用文件,而不是仅与 exit $intName
一起使用。这就是为什么我需要这个“hack”来保持脚本不被修改。以上是关于korn vs bash 退出代码的主要内容,如果未能解决你的问题,请参考以下文章