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,mkshpdksh 抱怨这是一个“坏数字”。它必须特定于 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 退出代码的主要内容,如果未能解决你的问题,请参考以下文章

返回与 bash 脚本中返回的命令不同的退出代码

在 bash 中添加(收集)退出代码

在 Bash 脚本中获取 Python 脚本的退出代码

带有最后一个退出代码的 Bash 提示

根据退出代码bash脚本将命令重定向到变量或文件?

如何使 bash 提示在 vs 代码的新行开始?