korn vs bash退出代码

时间:2012-06-01 07:50:31

标签: bash unix ksh exit-code mks

我有以下问题:

  • 我有一些以前使用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?

由于

2 个答案:

答案 0 :(得分:4)

假设您的代码位于名为 foo.sh 的文件中,您可以使用进程替换来包装它。例如:

bash <(sed 's/errorCode$/$&/' foo.sh)

Bash将修改后的代码解释为从文件描述符中读取,并且子shell的退出状态按预期设置。

$ echo $?
10

答案 1 :(得分:1)

你也可以在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,可能是原始脚本的意图。