我有一个我在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
答案 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 $?
比尔