在 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