如果我的脚本来自
. ./my_script.sh
source ./my_script.sh
然后停止在脚本中执行,我会使用return
。
如果我的脚本直接用
执行./my_script.sh
bash ./my_script.sh
然后我插入exit
。
如果我不知道用户是会采购它还是直接执行它,如何在不杀死调用终端的情况下干净地停止脚本?
最好,代码段应该能够终止脚本,即使它被放在脚本的一个函数中。
答案 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