2009-11-29 30 views
1

我有一個函數,我在我的shell腳本中使用,並基於某個條件,我想在該函數中調用「exit 0」,以便整個腳本退出。但由於某種原因,程序在函數中調用exit 0後仍然運行。爲什麼?從shell中的函數調用中退出整個程序?

check() 
{ 
    printf "Would you like to try again?\n" 
    read S 
    if [ "$S" = "y" ] 
    then 
     ./myprog 
    else  
     exit 0 
    fi 
} 

我這樣稱呼它:

if test $WRONG -eq 7 
then 
    printf "Sorry\n" 
    check 
fi 
+1

它幫助,如果您發佈包含退出腳本的一部分。 – rsp 2009-11-29 21:26:15

+0

我發佈我的代碼 – goe 2009-11-29 21:28:19

+0

測試代碼是否與check shell過程在同一實際shell源文件中調用'check'? – DigitalRoss 2009-11-29 21:42:00

回答

2

你有什麼對我的作品:

$ cat test-shell-exit 
#!/bin/sh 
check() 
{ 
    printf "Would you like to try again?\n" 
    read S 
    if [ "$S" = "y" ] 
    then 
     echo Try again 
    else 
     echo Done 
     exit 0 
    fi 
} 
echo Before 
check 
echo After 

$ ./test-shell-exit 
Before 
Would you like to try again? 
y 
Try again 
After 

$ ./test-shell-exit 
Before 
Would you like to try again? 
n 
Done 

難道你試試這個測試案例,並與來自任何差異更新你的答案?看來你遇到的問題是由你沒有提到的東西造成的。


更新:再次使用一個循環而不是調用程序的例子:

$ cat test-shell-exit 
#!/bin/sh 
check() 
{ 
    printf "Would you like to try again?\n" 
    read S 
    if [ "$S" = "y" ] 
    then 
     echo Try again 
    else 
     echo Done 
     exit 0 
    fi 
} 
while true; do 
    echo Before 
    check 
    echo After 
done 

$ ./test-shell-exit 
Before 
Would you like to try again? 
y 
Try again 
After 
Before 
Would you like to try again? 
y 
Try again 
After 
Before 
Would you like to try again? 
n 
Done 
+0

你的腳本工作正常。但是我注意到別的東西。我的主要腳本的初始運行也是如此。但是,如果在第一次運行期間,我選擇「y」作爲問題,我的程序通過調用「./myprog」再次調用自己,然後在那個運行中遇到問題,然後退出失敗。 – goe 2009-11-29 22:15:06

+2

啊,你再次調用同一個程序,這意味着你調用了一個子shell,而退出並不影響「outer」shell。不要這樣做。將你的程序寫成一個循環,檢查確定是繼續還是退出循環。您也可以使用'exec'作爲尾部遞歸的有限形式,但我不確定這是否會產生不必要的副作用。 (可能取決於你的程序) – 2009-11-29 22:24:39

+0

@roger,'exec'爲+1 – 2009-11-29 22:34:09

0

沒有任何代碼去了,我猜你的函數調用子shell,以及它是子shell是退出()ing,而不是運行主腳本的父shell。

+0

我發佈了我的代碼 – goe 2009-11-29 21:33:19

+0

對,它看起來像是發生了什麼。我怎樣才能退出主腳本? – goe 2009-11-29 21:38:43

+0

我沒有看到任何會創建子外殼的東西。 – DigitalRoss 2009-11-29 21:40:58

0

我期待找到你的代碼退出一個子shell,但我沒有看到任何理由,代碼看起來不錯,它似乎按預期運行。

所以我的猜測是,如果你認爲自己不是,或者你真的在做exit 0,並且只是在測試結果中沒有注意到它,你就不是在閱讀y

當你說「程序仍然運行」你的意思是「shell程序仍然調用check程序後運行」?

0

我digitalross同意,你向我們展示了什麼之外的東西是導致此行爲。退出0將退出當前進程。所以不知何故check()正在退出的單獨子進程中運行。你有調用這個調用之外的代碼嗎?

順便說一句,哪個操作系統和shell在運行?

可以強制家長通過類似退出(語法取決於你的shell)

check() || exit $? 

比爾