Tome su palabra " cada comando depende de cada comando anterior. Si algún comando falla, el script completo debería fallar " literalmente, creo que no necesita ninguna función especial para tratar los errores.
Todo lo que necesita es encadenar sus comandos con &&
operador y ||
operador, que hace exactamente lo que escribió.
Por ejemplo, esta cadena se romperá e imprimirá "algo salió mal" si alguno de los comandos anteriores se rompió (bash lee de izquierda a derecha)
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Ejemplo real (creé dir foo, archivo a, barra de directorios y archivo b solo para una demostración real):
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm bb || echo "something is wrong"
rm: cannot remove 'bb': No such file or directory
something is wrong #mind the error in the last command
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm aa && cd bar && rm b || echo "something is wrong"
rm: cannot remove 'aa': No such file or directory
something is wrong #mind the error in second command in the row
Y finalmente, si todos los comandos se han ejecutado con éxito (código de salida 0), el script simplemente continúa:
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm b || echo "something is wrong"
gv@debian:/home/gv/Desktop/PythonTests/foo/bar$
# mind that the error message is not printed since all commands were successful.
Es importante recordar que con el uso de && se ejecuta el siguiente comando si el comando anterior salió con el código 0, que para bash significa éxito.
Si algún comando sale mal en la cadena, entonces el comando / script / lo que sigue || será ejecutado.
Y solo para el registro, si necesita realizar diferentes acciones dependiendo del comando que se rompió, también podría hacerlo con un script clásico monitoreando el valor del $?
cual informa el código de salida del comando exactamente anterior (devuelve cero si el comando se ejecutó con éxito u otro número positivo si el comando falló)
Ejemplo:
for comm in {"cd foo","rm a","cd bbar","rm b"};do #mind the error in third command
eval $comm
if [[ $? -ne 0 ]];then
echo "something is wrong in command $comm"
break
else
echo "command $comm executed succesful"
fi
done
Salida:
command cd foo executed succesfull
command rm a executed succesfull
bash: cd: bbar: No such file or directory
something is wrong in command cd bbar
Consejo: Puede suprimir el mensaje "bash: cd: bbar: No such file ..." aplicando eval $comm 2>/dev/null