当我在shell脚本中使用exit命令时,脚本将终止终端(提示符)。是否有办法终止一个脚本,然后留在终端?

我的脚本run.sh希望通过直接获取或者从另一个脚本获取来执行。

编辑: 更具体地说,有两个脚本run2.sh as

...
. run.sh
echo "place A"
...

然后运行。sh as

...
exit
...

当我经过它的时候。如果它在run.sh中命中退出代码线,我希望它停止到终端并停留在那里。但是使用出口,整个航站楼会关闭。

PS:我已经尝试使用返回,但回声代码线仍将执行....


当前回答

我不知道这对你是否有用,但在zsh中,你可以退出一个脚本,但如果有一个提示,通过对一个不存在的变量使用参数展开,如下所示。

${missing_variable_ejector:?}

虽然这确实会在脚本中创建错误消息,但您可以使用以下方法来防止它。

{ ${missing_variable_ejector:?} } 2>/dev/null

其他回答

这就像在脚本run2.sh中放入一个运行函数一样。 您可以在run中使用退出代码,同时在bash tty中生成run2.sh文件。 如果给运行函数退出脚本的权力,并给run2.sh 它是退出终结者的力量。 然后因为运行函数有能力退出你的终止器。

    #! /bin/sh
    # use . run2.sh

    run()
    {
        echo "this is run"
        #return 0
        exit 0
    }

    echo "this is begin"
    run
    echo "this is end"

不管怎样,我同意卡兹的观点,这是一个设计问题。

还要确保返回时带有预期的返回值。否则,如果你在遇到退出时使用exit,它将从你的base shell退出,因为source没有创建另一个进程(实例)。

1)如果脚本成功,exit 0将从脚本中出来。

2)如果失败,exit 1将从脚本中出来。

你可以根据你的需要尝试以上两种。

正如其他人注意到的那样,源脚本和执行脚本使用return和exit来保持相同的会话打开,这是正确的。

这里有一个相关的技巧,如果你想要一个脚本,应该保持会话打开,不管它是否来源。

下面的示例可以像foo.sh那样直接运行,也可以像。foo.sh / foo.sh来源。无论哪种方式,它都将在“退出”后保持会话打开。$@字符串被传递,这样函数就可以访问外部脚本的参数。

#!/bin/sh
foo(){
    read -p "Would you like to XYZ? (Y/N): " response;
    [ $response != 'y' ] && return 1;
    echo "XYZ complete (args $@).";
    return 0;
    echo "This line will never execute.";
}
foo "$@";

终端的结果:

foo.sh美元 你想要XYZ吗?(Y / N): N 美元。foo.sh 你想要XYZ吗?(Y / N): N $ | (终端窗口保持打开并接受额外输入)

这对于在单个终端中快速测试脚本更改非常有用,同时在您工作时在主退出/返回下保留一堆废弃代码。它还可以使代码在某种意义上更具可移植性(如果您有大量的脚本,这些脚本可能以不同的方式调用,也可能不以不同的方式调用),尽管只在适当的地方使用return和exit要简单得多。

要编写一个既可以作为shell脚本运行,也可以作为rc文件源运行的脚本,该脚本可以检查和比较$0和$BASH_SOURCE,并确定是否可以安全地使用exit。

下面是一个简短的代码片段

[ "X$(basename $0)" = "X$(basename $BASH_SOURCE)" ] && \
    echo "***** executing $name_src as a shell script *****" || \
    echo "..... sourcing $name_src ....."