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.
- Opção
- 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