如何在脚本中停止执行,这些脚本可能是源代码或直接执行的

时间:2014-05-20 01:10:14

标签: bash

如果我的脚本来自

. ./my_script.sh
source ./my_script.sh

然后停止在脚本中执行,我会使用return

如果我的脚本直接用

执行
./my_script.sh
bash ./my_script.sh

然后我插入exit

如果我不知道用户是会采购它还是直接执行它,如何在不杀死调用终端的情况下干净地停止脚本?

最好,代码段应该能够终止脚本,即使它被放在脚本的一个函数中。

2 个答案:

答案 0 :(得分:5)

尝试以下方法:

ec=0 # determine the desired exit code

return $ec 2>/dev/null || exit $ec
如果脚本来源,

return将成功,否则exit将启动。如果脚本2>/dev/null会禁止显示错误消息来源

最终效果是脚本将以所需的退出/返回代码终止,无论它是否来源。


更新:OP希望能够从脚本中的内的中退出脚本。

我能想到的唯一方法是将所有脚本的代码放在子shell 中,并从子shell内的函数内部调用exit;然后在子shell之后放置return 2>/dev/null || exit命令(作为子shell外的唯一语句):

#!/usr/bin/env bash

( # subshell to place all code in

  foo() {
    exit 1  # exit the subshell
  }

  foo # invoke the function

)

# Terminate script with exit code from subshell.
ec=$?; return $ec 2>/dev/null || exit $ec

答案 1 :(得分:1)

这是找出用于调用脚本的方法的一种方法。

if [[ "$0" == "bash" ]]; then
   echo "source 'file' was used"
else
   echo "bash 'file' was used"
fi

更新,以回应@ mklement0的评论:

如果您的脚本名为my_script.sh,则可以使用

b=$(basename "$0")
if [[ "$b" == "my_script.sh" ]]; then
   echo "bash 'file' was used"
else
   echo "source 'file' was used"
fi