Você poderia fazer algo como
for t in $tasks; do
process "$t" || { failed=1; break; }
commit "$t"
done
if (( failed )); then
echo "Failed something" >&2
fi
Gostaria de executar uma série de tarefas, mas parar caso alguma delas falhasse, por isso escrevi (algo como):
for task in [TASKS]; do
process "$task" || break
commit "$task"
done
Isso funciona bem, mas (como especificado ) o status de saída de esse loop é zero mesmo se quebrarmos cedo. Idealmente, break
-ing seria capaz de transmitir a falha.
Eu sei que retornar 0
é o comportamento documentado de break
, mas estou curioso para saber se existem soluções alternativas relativamente limpas. O melhor que posso imaginar é envolver isso em uma função e definir uma variável didBreak
e usar isso como o status de saída (da função). Funcionaria, mas parece excessivamente complexo.
Minha solução imaginada é:
run_til_failure() {
local didBreak=0
for task in [TASKS]; do
process "$task" || { didBreak=1; break; }
commit "$task"
done
local loopExit=$?
if (( loopExit )); then return $loopExit; fi
return $didBreak
}
Tags bash return-status