如何延迟评估 shell for 循环中的命令
How to lazy evaluate commands in a shell for loop
我想实现一种回退机制:如果一个命令失败,请尝试下一个或下一个(或下一个)。可能有任意数量的命令以相同的方式处理。以下实现(简化,错误处理应该更好,但这不是当前的问题)在评估 for 循环内容之前运行所有命令。我如何让它变懒?
f() {
for message in $(cmd0) $(cmd1) $(cmd2) # cmd1, cmd2 should evaluate lazily
do
if [ $? == 0 ]
then
echo "ok: $message"
return # exit early
fi
done
echo "error: $message"
}
假设你的命令,cmd0
,cmd1
return 0
成功 运行 和非零失败你可以做
f() {
for cmd in cmd0 cmd1 cmd2; do
if "$cmd"; then
echo "ok: $message"
return
fi
done
}
查看示例 运行ning 命令,true
,false
return 分别编码 0
和 1
,
f() {
for cmd in false true; do
echo "running command $cmd"
if "$cmd"; then
echo "ok: $message"
return
fi
done
}
运行它,
f
running command false
running command true
ok:
你也可以这样做
f() { cmd0 || cmd1 || cmd2; }
仅当 cmd0
失败时才计算 cmd1
,并且仅当 cmd0
和 cmd1
都失败时才计算 cmd2
。
我想实现一种回退机制:如果一个命令失败,请尝试下一个或下一个(或下一个)。可能有任意数量的命令以相同的方式处理。以下实现(简化,错误处理应该更好,但这不是当前的问题)在评估 for 循环内容之前运行所有命令。我如何让它变懒?
f() {
for message in $(cmd0) $(cmd1) $(cmd2) # cmd1, cmd2 should evaluate lazily
do
if [ $? == 0 ]
then
echo "ok: $message"
return # exit early
fi
done
echo "error: $message"
}
假设你的命令,cmd0
,cmd1
return 0
成功 运行 和非零失败你可以做
f() {
for cmd in cmd0 cmd1 cmd2; do
if "$cmd"; then
echo "ok: $message"
return
fi
done
}
查看示例 运行ning 命令,true
,false
return 分别编码 0
和 1
,
f() {
for cmd in false true; do
echo "running command $cmd"
if "$cmd"; then
echo "ok: $message"
return
fi
done
}
运行它,
f
running command false
running command true
ok:
你也可以这样做
f() { cmd0 || cmd1 || cmd2; }
仅当 cmd0
失败时才计算 cmd1
,并且仅当 cmd0
和 cmd1
都失败时才计算 cmd2
。