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

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

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

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

然后运行。sh as

...
exit
...

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

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


当前回答

我认为这是因为您在源模式下运行它 带点的

. myscript.sh

你应该在子shell中运行它:

/full/path/to/script/myscript.sh

“源”http://ss64.com/bash/source.html

其他回答

您可以在return语句/命令之后添加一个额外的退出命令,这样它就可以同时从命令行执行脚本和从终端获取源。

脚本中的退出代码示例:

   if [ $# -lt 2 ]; then
     echo "Needs at least two arguments"
     return 1 2>/dev/null
     exit 1
   fi

当您在返回命令之后查找脚本时,将不会调用带有exit命令的行。

当您执行脚本时,返回命令会给出一个错误。因此,我们通过将错误消息转发到/dev/null.来抑制错误消息

你只需要用以下命令结束你的sh脚本:

bash

任何超出这个范围的事情都是你创造力的一部分。:)

改进Tzunghsing的答案,有更清晰的结果和错误重定向,用于无声使用:

#!/usr/bin/env bash

echo -e "Testing..."

if [ "X$(basename $0 2>/dev/null)" = "X$(basename $BASH_SOURCE)" ]; then
    echo "***** You are Executing $0 in a sub-shell."
    exit 0
else
    echo "..... You are Sourcing $BASH_SOURCE in this terminal shell."
    return 0
fi

echo "This should never be seen!"

或者如果你想把这个放进一个静默函数:

function sExit() {
    # Safe Exit from script, not closing shell.
    [ "X$(basename $0 2>/dev/null)" = "X$(basename $BASH_SOURCE)" ] && exit 0 || return 0
}

...

# ..it have to be called with an error check, like this: 
sExit && return 0

echo "This should never be seen!"

请注意:

如果你在脚本中启用了erreexit (set -e),并且返回N且N != 0,你的整个脚本将立即退出。要查看所有shell设置,请使用,set -o。 在函数中使用时,第一个返回0表示退出函数,第二个返回0表示退出脚本。

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

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

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

我也遇到了同样的问题,根据上面的答案和我的理解,最终对我有用的是:

有一个shebang行来调用预期的脚本,例如, # !/bin/bash使用bash执行脚本

我有两种shebang的脚本。因此,使用sh或。不可靠,因为它会导致错误执行(比如当脚本运行不完全时退出)

因此,答案是

确保脚本有一个shebang,这样就不会对其预期的处理程序产生疑问。 Chmod .sh文件以便执行。(chmod +x file.sh) 直接调用它,不需要任何sh或。 (. / myscript.sh)

希望这对有类似问题的人有所帮助。