【问题标题】:korn vs bash exit codekorn vs bash 退出代码
【发布时间】: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

标签: bash unix ksh exit-code mks


【解决方案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”来保持脚本不被修改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2018-09-05
  • 2016-08-16
  • 1970-01-01
  • 2023-01-26
相关资源
最近更新 更多