是否有可能在bash中有一个函数(或类似的东西),当调用时,它将从其调用函数返回?
让我解释一下......在我的shell脚本中,我有一些可以随处使用的常用功能
function die () { echo "$0: ERROR : ${2:-} $(date)"; <script-specific cleanup>; exit $1; }
# Example use
[ $count -lt 5 ] && die 1 "Incorrect usage count='$count' must be >5."
如果您想完全退出脚本,那就太棒了。但是你可以在一个函数(或类似的东西)中“执行一些常见的清理任务并退出当前函数”吗?显然,下面函数中的return
只会从die_fn
返回而不是从其调用者返回。
# This of course is no good
function die_fn () { echo "$0: ERROR : ${2:-} $(date)"; <cleanup>; return $1; }
function foo ()
{
...
[ $found -eq 0 ] && die_fn 1 'No targets founds. Skipping build'
...
}
我想,您可以在需要时将echo "$0: ERROR : ${2:-} $(date)"; <script-specific cleanup>; return $1;
放在die_fn.sh
和源中,但这对于本来应该是简化的工作来说是很多工作。
更新
似乎很可能以任何优雅和可维护的方式实现这一点。除非有任何新的启示,否则我怀疑在我想要简洁的时候我会将&& return 1
添加到该行,并且在不需要时会有一个完整的if
语句。
答案 0 :(得分:0)
这种行为(我能想到的)的最接近的近似值是将父function(foo
)定义为subshell compound command(如果您的用例可以接受) ),然后在exit
函数中使用die
退出最内层shell(即父foo
函数)。
例如:
#!/bin/bash
die() { echo "$0: DIE: ${2:-} $(date)"; exit "$1"; }
foo() (
echo "In foo"
die 1 'No targets found. Skipping build'
)
foo
echo "foo exited with $?"
结果:
In foo
./script.sh: DIE: No targets found. Skipping build Sun 19 Nov 21:18:42 CET 2017
foo exited with 1