Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否从shell中的函数调用退出整个程序?_Shell_Unix - Fatal编程技术网

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

是否从shell中的函数调用退出整个程序?,shell,unix,Shell,Unix,我在shell脚本中使用了一个函数,根据特定条件,我想在该函数中调用“exit 0”,以便整个脚本退出。但由于某些原因,在调用函数中的出口0后,程序仍在运行。为什么? check() { printf "Would you like to try again?\n" read S if [ "$S" = "y" ] then ./myprog else exit 0 fi } 我这样称呼它: if t

我在shell脚本中使用了一个函数,根据特定条件,我想在该函数中调用“exit 0”,以便整个脚本退出。但由于某些原因,在调用函数中的出口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

如果没有任何代码可供参考,我猜您的函数正在调用一个子shell,而退出()的是该子shell,而不是运行主脚本的父shell。

我本来希望看到您的代码退出子shell,但我看不出任何原因,代码看起来正常,并且它似乎按照我的预期运行

因此,我的猜测是,要么你认为自己没有读到
y
,要么你真的在做
exit 0
,只是在测试结果中没有注意到它


当你说“程序仍在运行”时,你的意思是“shell程序在调用
检查
过程后仍在运行”

你所做的对我有用:

$ 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

我同意digitalross的观点,你展示给我们的东西之外的东西导致了这种行为。退出0将退出当前进程。因此,check()运行在一个单独的正在退出的子进程中。您是否有调用此调用之外的代码

顺便问一下,你在运行哪个操作系统和shell

您可以通过以下方式强制父级退出(语法取决于shell)


Bill

如果您发布包含退出的脚本部分,这会有所帮助。调用
check
的测试代码是否与check shell过程在同一个实际shell源文件中?是的,在相同的脚本中有,并且函数是在执行测试之前定义的。对,看起来就是这样。我怎么才能退出主脚本呢?我看不到任何会创建子shell的东西。那么对“/myprog”的调用呢?因为当它不起作用时。它总是在程序第一次运行时工作,但其他任何时候都不工作。您的脚本工作正常。然而,我注意到了另一件事。我的主脚本的第一次运行也是如此。但是,如果在第一次运行期间,我为问题选择了“y”,并且我的程序通过调用“./myprog”再次调用自身,并且我在该运行中遇到该问题,那么退出失败。啊,您再次调用了同一个程序,这意味着您确实调用了一个子shell,并且退出该子shell不会影响“外壳”。不要那样做。将程序编写为循环,并通过检查确定是继续还是退出该循环。您也可以使用
exec
作为尾部递归的一种有限形式,但我不确定这是否会产生不必要的副作用。(可能取决于您的程序。)所以没有办法强制退出任何级别的子shell?您不能强制父进程退出。您可以要求它退出(通过某种形式的通信)或要求操作系统终止它(KILL信号,这与父级退出不同——您肯定也不希望出现这种情况)。但是,似乎用一个简单的循环来解决这个问题比两个循环都好。嗯,我通过在调用“/myprog”后加上“break”来修复它,谢谢你的帮助!
check() || exit $?