从shell中的函数调用退出整个程序?

时间:2009-11-29 21:23:36

标签: shell unix

我有一个我在shell脚本中使用的函数,并且基于某个条件,我想在该函数中调用“exit 0”,以便整个脚本退出。但由于某种原因,程序在函数中调用exit 0后仍然运行。为什么呢?

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

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

没有任何代码可以使用,我猜你的函数正在调用一个子shell,它就是那个子shell,它是exit()ing,而不是运行主脚本的父shell。

答案 2 :(得分:0)

我原本希望找到你的代码退出子shell,但我没有看到任何理由,代码看起来还不错,而且它似乎按预期运行。

所以我的猜测是,当你认为自己不是y时,或者你真的正在做exit 0,而你刚刚错过了在你的测试结果中注意到它。

当您说“程序仍在运行”时,您的意思是“ shell程序在调用check程序后仍然运行”?

答案 3 :(得分:0)

我同意digitalross的观点,即你向我们展示的东西之外的东西正在导致这种行为。 exit 0将退出当前进程。所以check()在一个单独的子进程中运行正在退出。你有这个调用之外的代码吗?

顺便说一下,你在运行哪个OS和shell?

您可以强制父级通过类似(语法取决于您的shell)

之类的东西退出
check() || exit $?

比尔