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

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

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

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

然后运行。sh as

...
exit
...

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

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


当前回答

如果命令成功执行,则返回值为0。之后我们可以检查它的返回值。

bash中是否有“goto”语句?

这里有一些肮脏的工作方法,使用陷阱只向后跳。


#!/bin/bash
set -eu
trap 'echo "E: failed with exitcode $?" 1>&2' ERR

my_function () {
    if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
        echo "this is run"
        return 0
    else
        echo "fatal: not a git repository (or any of the parent directories): .git"
        goto trap 2> /dev/null
    fi
}

my_function
echo "Command succeeded"  # If my_function failed this line is not printed

相关:

https://stackoverflow.com/a/19091823/2402577 如何使用$?并测试检查功能?

其他回答

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

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

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

是的,你可以用return代替exit。它的主要目的是从shell函数返回,但如果在source-d脚本中使用它,它将从该脚本返回。

如Bash参考手册§4.1“Bourne Shell Builtins”所述:

return [n] Cause a shell function to exit with the return value n. If n is not supplied, the return value is the exit status of the last command executed in the function. This may also be used to terminate execution of a script being executed with the . (or source) builtin, returning either n or the exit status of the last command executed within the script as the exit status of the script. Any command associated with the RETURN trap is executed before execution resumes after the function or script. The return status is non-zero if return is used outside a function and not during the execution of a script by . or source.

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

脚本中的退出代码示例:

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

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

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

改进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表示退出脚本。

如果你的终端模拟器没有-hold,你可以净化一个源脚本,并保持终端:

#!/bin/sh
sed "s/exit/return/g" script >/tmp/script
. /tmp/script
read

否则你可以使用$TERM -hold -e脚本