Uma alternativa para encadear os comandos junto com &&
seria executar o script, ou a seção do script, ou sub-shell, com a opção -e
definida ( set -e
, às vezes chamada de errexit
opção). Isso faria com que o script ou sub-shell simplesmente saísse em um erro:
( set -e
command1
command2
command3 )
Quanto a uma reversão de etapas já executadas, provavelmente é impossível conseguir isso em um script de shell.
Tome, por exemplo, um script que executa um exit
ou uma reinicialização do sistema, ou até mesmo manipula dados no disco:
( set -e
if (( $# == 0 )); then
echo "No command line arguments!" >&2
exit
fi
echo "We're cool"
false )
( set -e
case "$cmd" in
restart) sudo reboot ;;
greet) echo "Hi there" ;;
*) echo "Huh?" ;;
esac
false )
( set -e
rm -f /tmp/important_tmp_file
echo "oh oh"
false )
Não haveria nenhuma maneira de reverter um exit
de ter sido executado ou uma reinicialização de ter sido executada ou de recuperar um arquivo automaticamente. Observe também que a saída para o terminal também está fora do alcance do shell e não pode ser chamada de volta.