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

Gar*_*ett 3 bash

如果我的脚本来源

. ./my_script.sh
source ./my_script.sh
Run Code Online (Sandbox Code Playgroud)

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

如果我的脚本是直接执行的

./my_script.sh
bash ./my_script.sh
Run Code Online (Sandbox Code Playgroud)

然后我插入一个exit.

如果我不知道用户是将采购它还是直接执行它,我怎么能干净地停止脚本而不杀死它所调用的终端?

优选地,代码片段应该能够终止脚本,即使它被放置在脚本的一个函数内.

mkl*_*nt0 5

请尝试以下方法:

ec=0 # determine the desired exit code

return $ec 2>/dev/null || exit $ec
Run Code Online (Sandbox Code Playgroud)

return如果脚本正在采购会成功,否则exit会一命呜呼的2>/dev/null抑制情况下,脚本错误消息没有来源.

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


更新:OP希望能够从脚本中的函数内部退出脚本.

我能想到的唯一方法是将所有脚本的代码放在子shell中,exit子shell中的函数内部调用; 然后将return 2>/dev/null || exit命令子shell(如子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
Run Code Online (Sandbox Code Playgroud)