Como garantir que o script seja executado com sucesso como uma transação [fechada]

2

Suponha que eu tenha um script como este:

command1 params
command2 params
command3 params

Agora, como entendo, cada um desses comandos será executado independentemente do status de retorno do anterior. Mas quero que todos sejam executados como uma única transação, ou seja, se algum comando anterior falhar no script:

  1. não deve continuar
  2. idealmente, reverta ações feitas por comandos anteriores

Para a primeira pergunta, eu entendo que posso usar && operator e encadear todos os comandos com ele, ou colocar se verificar por $? após cada comando, mas essas abordagens são as únicas opções?

E qual é a abordagem padrão para a segunda pergunta?

    
por Max Koretskyi aka Wizard 22.01.2017 / 17:28

1 resposta

3

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.

    
por 22.01.2017 / 17:48