2012-06-01 73 views
0

我有以下問題:科恩VS慶典退出代碼

  • 我以前用的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?

感謝

+0

沒有任何版本的ksh或其變體,我可以在'exit'語句中對變量沒有美元符號的情況下工作。 Ksh 93將其作爲0並且'mksh'和'pdksh'抱怨這是一個「不好的數字」。它必須是特定於MKS工具包中ksh版本的內容。 –

+0

@DennisWilliamson是的,這是與ksh從mks – INS

回答

1

你也可以在bash

#!/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 

執行的ksh腳本覆蓋退出之前做到這一點。 這個例子是與原來的代碼兼容的,即給予0.1

第二個例子的退出代碼

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,最初的劇本打算大概是什麼。

+0

好吧,我理解你的例子;但我如何找到退出代碼?因爲我需要它 – INS

+0

你原來的ksh代碼退出errorCode在ksh下運行時實際上給出了退出代碼0,是不是你想要的?或者你希望errorCode中的實際值是退出代碼。我認爲原始代碼有一個錯誤,它不會在ksh下產生錯誤。所以這個例子與原來的ksh兼容。 – pizza

+0

+1這真的工作,因爲我想(最好的答案) – INS

4

假設你的代碼是在一個名爲foo.sh文件,你可以用進程替換包裹。例如:

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

Bash解釋修改後的代碼作爲從文件描述符中讀取,和如預期子外殼的退出狀態被設置。

$ echo $? 
10 
+0

哇,好!很高興每天學習一些東西。祝你們好運。 – shellter

+0

+1這是一個巧妙的解決方案 – INS