Sobes.tech
Middle

Como lida com erros de utilizador no bash?

sobes.tech IA

Resposta da IA

No bash, os erros do utilizador são principalmente tratados usando:

  • Códigos de saída dos comandos: Cada comando devolve um código de finalização (estado de saída). 0 geralmente significa sucesso, qualquer outro valor indica um erro.
  • Estruturas condicionais: if, elif, else são usados para verificar os códigos de saída.
  • Operadores lógicos: && (e), || (ou) permitem executar comandos dependendo do sucesso/fracasso dos anteriores.
  • Redireções de saída: > (stdout), 2> (stderr), &> (stdout e stderr).
  • Traps: Permitem executar um comando ao receber um sinal ou ao terminar um script.

Exemplos:

#!/bin/bash

# Verificação do código de saída
if ! command_that_might_fail; then
  echo "Erro na execução do comando!" >&2 # Redirecionamento para stderr
  exit 1 # Terminar o script com código de erro
fi

# Operador lógico &&
command_successful && echo "Comando executado com sucesso" || echo "O comando terminou com erro"

# Trap para lidar com SIGINT (Ctrl+C)
trap 'echo "Sinal de interrupção recebido. A sair..."; exit 1' SIGINT

# Redirecionar erros e mensagem
if command_with_errors 2> error.log; then
  echo "Comando executado sem erros"
else
  echo "Erros detectados. Detalhes em error.log"
fi

Para aumentar a fiabilidade dos scripts, também se usam:

  • set -e: O script termina se qualquer comando falhar (exceto em if e while).
  • set -u: Variáveis devem estar definidas antes de usar.
  • set -o pipefail: O código de saída de uma pipeline será o de a última comando que falhou.
#!/bin/bash

set -euo pipefail

# Este script terminará se "undefined_var" não estiver definido
echo "$undefined_var"

# Este script terminará se "failing_command" devolver um código diferente de zero
failing_command

Uso de funções e argumentos:

#!/bin/bash

# Função com verificação de argumentos
validate_args() {
  if [ $# -ne 2 ]; then
    echo "Uso: $0 <argumento1> <argumento2>" >&2
    exit 1
  fi
}

validate_args "$@"