bash - 通过调用另一个函数退出当前函数?

时间:2017-11-19 19:01:33

标签: bash shell

是否有可能在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语句。

1 个答案:

答案 0 :(得分:0)

这种行为(我能想到的)的最接近的近似值是将父functionfoo)定义为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