zsh - ZSH 自定义函数,如重复
问题描述
我有一个命令,当发生某个错误时,我想重复该命令。为了使这个通用化,我想提出一个函数,它可以采用任何其他函数来基本上包装该行为,这与repeat
ZSH 中的非常相似。
所以我想要的是这样的:
repeatWhenError { someFunction() }
这将在大括号内重复该函数,直到它成功。有没有一种简单的方法可以在 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
推荐阅读
- ruby - logstash 过滤器是否按顺序运行?
- php - 如何使用 PhP / MySql 在多个数据库中发送/插入数据
- c++ - c++函数调用char作为参数
- javascript - 理想情况下,如何仅使用 CSS 从下拉列表中旋转/旋转 180' 插入符号?
- go - 模块名称工作不正常
- node.js - Angular CLI 和 react JavaScript 在同一个项目中运行如何使其成为可能
- android - Android应用程序,即使应用程序被杀死,也会继续发送请求
- r - R中的PostgreSQL:在数据库中查找R向量中存在变量的行
- javascript - 如何保护 Koa.js 应用程序免受 CSRF 攻击?
- amazon-web-services - 无法从浏览器访问 Jenkins UI