首页 > 解决方案 > ZSH 自定义函数,如重复

问题描述

我有一个命令,当发生某个错误时,我想重复该命令。为了使这个通用化,我想提出一个函数,它可以采用任何其他函数来基本上包装该行为,这与repeatZSH 中的非常相似。

所以我想要的是这样的:

repeatWhenError { someFunction() }

这将在大括号内重复该函数,直到它成功。有没有一种简单的方法可以在 ZSH 中实现这一点?

标签: zsh

解决方案


从我的点文件

retry () {
    retry-limited 0 "$@"
}
retry-limited () {
    retry-limited-eval "$1" "$(gquote "${@:2}")"
}
retry-limited-eval () {
    local retry_sleep="${retry_sleep:-0.1}"
    local limit=0
    local ecode=0
    until {
            test "$1" -gt 0 && test $limit -ge "$1"
        } || {
            eval "${@:2}" && ecode=0
        }
    do
        ecode="$?"
        ecerr Tried eval "${@:2}" "..."
        sleep $retry_sleep
        limit=$((limit+1))
    done
    return "$ecode"
}
gquote () {
    \noglob : Use this to control quoting centrally.
    print -r -- "${(q+@)@}"
}
ecerr () {
    print -r -- "$@" >&2
}

用法:

retry someFunction

推荐阅读