Comece seu shell/bash script com essas 3 linhas e o deixe mais confiável

Introdução

Shell script são poderosas ferramentas para o dia a dia de quem trabalha com programação, administração de sistemas e áreas correlatas.

Para tornar seus scripts mais robustos, confiáveis, e fáceis de encontrar problemas, comece com as seguintes 3 linhas e colha os benefícios de um ambiente shell mais previsível.

#!/usr/bin/env bash

set -euEo pipefail
trap 'echo "${BASH_SOURCE:-unknown}:${LINENO:-unknown}: $BASH_COMMAND";' ERR

Explicação

  • Na diretiva de interpretação (shebang) utilize o comando /usr/bin/env bash, um comando portátil, para encontrar o interpretador bash nos sistemas GNU/Linux, BSD e Mac.
  • Use o comando set para configurar o shell.
    • Opção errexit (-e): Encerra imediatamente se um pipeline (que pode consistir de um único comando simples), uma lista ou um comando composto (veja GRAMÁTICA DO SHELL acima) sair com um status diferente de zero.
    • Opção nounset (-u): Trata variáveis e parâmetros não definidos, exceto os parâmetros especiais "@" e "*", como um erro ao realizar expansão de parâmetros. Se a expansão for tentada em uma variável ou parâmetro não definido, o shell imprime uma mensagem de erro e, se não estiver em modo interativo, sai com um status diferente de zero.
    • Opção errtrace (-E): Se definida, qualquer trap em ERR é herdado por funções de shell, substituições de comandos e comandos executados em um ambiente de subshell. Normalmente, o trap ERR não é herdado nesses casos.
    • Opção pipefail: Se definida, o valor de retorno de um pipeline é o valor do último comando (mais à direita) a sair com um status diferente de zero, ou zero se todos os comandos no pipeline saírem com sucesso.
  • Utilize o comando trap para capturar sinais de erro.
    • 'echo "${BASH_SOURCE:-unknown}:${LINENO:-unknown}: $BASH_COMMAND";': Imprime os detalhes com arquivo, linha, comando e mensagem de erro ocorre uma falha.
    • ERR: Este é o sinal para o qual o trap está sendo definido. O sinal ERR é gerado quando um comando sai com um status diferente de zero.

Na prática

Crie um arquivo chamado tabnews.sh e dê permissão de execução com chmod +x tabnews.sh.

#!/usr/bin/env bash

set -euEo pipefail
trap 'echo "${BASH_SOURCE:-unknown}:${LINENO:-unknown}: $BASH_COMMAND";' ERR

cd /this-directory-should-not-exist

Ao executar o shell script acima veremos uma mensagem de erro como a que segue abaixo:

tabnews.sh: line 6: cd: /this-directory-should-not-exist: No such file or directory
tabnews.sh:6: cd /this-directory-should-not-exist

Interessante! Obrigado por compartilhar.