在 Bash 中抽象 echo && return

在 Bash 中抽象 echo && return

在 Bash 中我希望能够编写类似以下内容:

tst() {
  [ -z "$1" ] && die "No parameters provided!"
  # do whatever
}

但我不能die这样定义:

die() {
  echo "$*"
  exit 1
}

因为如果我的测试函数正在我当前的 shell 中运行(例如. ./file-with-function),那么它会中止我当前的会话。我真正想要它做的是类似这样的事情:

tst() {
  [ -z "$1" ] && echo "No parameters provided!" && return
}

但我想在单个函数调用中执行回显和返回。有没有巧妙的方法可以做到这一点?

答案1

如何检测脚本是否正在被调用对这个[[ ${BASH_SOURCE[0]} == $0 ]]技巧的解释。

die () {
    msg=$1
    code=${2:-1}
    echo "$msg" >&2
    if [[ ${BASH_SOURCE[0]} == $0 ]] ; then
        echo exit $code
    else
        echo return $code
    fi
}

此函数返回在当前上下文中应该调用什么来终止,因此你必须以特殊的方式调用它:

(( $# )) || $(die 'No parameters!')

答案2

die另一个想法:如果你想继续活下去就不要使用:

warn() { echo "$*" >&2; }
die() { warn "$@"; exit 1; }

if something really terrible; then die "I can't continue"; fi
if something bad but tolerable; then warn "That shouldn't happen"; fi

相关内容