Usando shellcheck para encontrar e corrigir erros de script

Conteúdo

Shellcheck é uma ótima ferramenta de análise de script de shell do Linux que pode ser usada para detectar erros de programação comuns. Shellcheck analisa scripts e relata erros e avisos, assim como o que um compilador faria.

O que é Shellcheck?

Se você já é um desenvolvedor Linux Bash há algum tempo, você provavelmente encontrou uma grande quantidade de bugs em seus próprios scripts ou nos scripts de outros. É provável que a introdução de bugs no código aconteça quando humanos estiverem desenvolvendo código. Mesmo os melhores desenvolvedores podem perder uma complexidade imprevista ou advertência em seu código de vez em quando..

Na festa, não existe um compilador real como, como um exemplo, e C ++. Apesar disto, existe um conjunto de ferramentas que podem ser de grande ajuda no desenvolvimento de scripts bash. Uma vez que tal ferramenta seja verificada. Este excelente utilitário analisará um arquivo de script bash e fará recomendações com base no que for encontrado durante sua análise.. É um pouco como ter um compilador para bash.

Ferramentas como shellcheck diferem em sua operação de outras ferramentas de tempo de execução, como exemplo, execute um script com bash -x para ver cada um dos comandos do script que está sendo executado, e isso em tempo real. A razão é que o shellcheck irá analisar o script (Arquivo) sem realmente executá-lo, de nuevo de manera equivalente a lo que haría un compilador.

Para mais informações sobre bash -x, es factible que desee leer Bash Automation and Scripting Basics (Papel 3), que forma parte de la serie de 3 partes Bash Automation and Scripting Basics.

Instalando Shellcheck

Instalar Shellcheck em sua distribuição Linux baseada em Debian / Apt (como Ubuntu e Mint), execute o seguinte comando em seu terminal:

sudo apt install shellcheck

Instalar Shellcheck em sua distribuição Linux baseada em RedHat / Yum (como RHEL, Centos e Fedora), execute o seguinte comando em seu terminal:

sudo yum install shellcheck

Com pressa Shellcheck

Una vez que hayamos instalado shellcheck, podemos hacer una prueba simple con un script roto. Primero definimos nuestro guión test.sh Como segue:

#! / bin / wash echo 'Bash no es wash echo Más errores para mí "e [ -d ./directory }; than
  echo 'sure! < start
fif

How many bugs can you find? (Tip: there are 8!).

Let’s next see what shellcheck makes of this code:

shellcheck test.sh

Saída Shellcheck 1

Imediatamente na primeira linha, ele encontra um problema com o shebang especificação. Se você ainda não ouviu falar em shebang, por favor, verifique nossa Parte de Bases de Automação e Scripting Bash 1 artigo. Nossa linha de trocadilhos #!/bin/wash deveria estar #!/bin/bash. Vamos consertar isso. Edição 1/8 fixo!

Ao mesmo tempo, também corrigiremos os outros dois problemas imediatamente reconhecidos por verificação de concha: Você se esqueceu de fechar esta string entre aspas simples? para a segunda linha: local! Edição 2/8 fixo. For the third issue there is a little confusion as to our/the developers intent for shellcheck, and this is to be expected, as the ' on line 2 opens a string which is only terminated on line 5 when another ' is seen!

As this third issue is thus a result of the second issue, this run will allow us to fix two issues for the time being. Our script now looks like this:

#!/bin/bash
echo 'Bash is not wash'
echo More errors for me"
E se [ -d ./directory }; than
  echo 'sure! < start
fif

Let’s run shellcheck on this again after making the corrections and see what the output is.

Saída Shellcheck 2

In this instance, shellcheck sees that a " is opened on line 3 (even though it is at the end of the line, it is actually an opening double quote as such), and that even at script end (note the line 8 indication, which does not exist in our 6-line script with a single empty line after the last line. Let’s clean up this empty line, and fix the double quoting issue at the start of line 3, which can now be readily understood. Edição 3/8 fixo!

Our script now looks like this:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
E se [ -d ./directory }; than
  echo 'sure! < start
fif

Re-running shellcheck (observe como essas etapas são semelhantes novamente ao uso de um compilador em outras linguagens de codificação):

Saída do Bash shellcheck 3

Não poderia ser mais claro; O erro de sintaxe mencionado foi nesta expressão if e Esperado teste para terminar aqui. Faremos conforme sugerido e mudaremos o } para ], fazendo a linha ler if [ -d ./directory ]; than. Problema 4/8 resolvido! Executamos o shellcheck novamente e agora somos apresentados ao seguinte:

Shellcheck Salida 4

Outro problema de aspas simples. Já sabemos como resolvê-los. Vamos mudar echo 'sure! < start para echo 'sure!' < start (Problema 5/8 resolvido!) e execute novamente o shellcheck mais uma vez:

Partida 5 de Shellcheck

Interesante al principio, vemos que shellcheck no puede analizar una línea. Aunque esto puede parecer una deficiencia en shellcheck, leyendo un poco más, vemos que en algún lugar un then Está perdido. Ahá! Hemos puesto than ao invés de then. Qué error tan descuidado 😉 Se solucionó fácilmente (¡problema 6/8 resolvido!). Nuestro script ahora se ve así:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
E se [ -d ./directory ]; then
  echo 'sure!' < start
fif

Y otra ejecución de shellcheck nos proporciona otra información útil:

Partida 6 de Shellcheck

Tenemos una falta fi! Ajá si fif No lo hará. Cambiamos fif para fi en la última línea del script (problema 7/8) se corrigió y ejecutó shellcheck una vez más.

Partida 7 de Shellcheck

Un obstáculo de redirección. Honestamente no esperaba shellcheck para captar además este error, Sendo que < además se puede utilizar en Bash, pero seguro que lo hizo. Na realidade, nuestra redirección estaba destinada a ser > ao invés de <. Problema 8/8 – ¡todos los problemassolucionados! Esto nos lleva al guión final.

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
E se [ -d ./directory ]; then
  echo 'sure!' > start
fi

Veamos qué piensa Shellcheck ahora.

Salida de Shellcheck 8

¡Perfecto! Y el guión funciona estupendamente, desde la primera ejecución.

Si revisa el resultado de los múltiples comandos de shellcheck, además notará otra característica muy útil de shellcheck, especialmente para iniciantes: um conjunto de hiperlinks é exibido (links para sites), que pode ser clicado com o mouse na janela do terminal, ou você pode selecionar (Sim é necessário)> clique com o botão direito para copiar e depois colar em um navegador. Ao clicar no referido link, vai acessar o proyecto shellcheck GitHub.

eu escapei?

Se você deseja verificar rapidamente apenas as alternativas mais importantes, sugerimos que você dê uma olhada no --severity={SEVERITY} opção, onde você substituiria {SEVERITY} com um de error, warning, info, style.

Por isso, se você estiver apenas procurando por erros e avisos, usaria --severity=warning (incluindo níveis superiores, nesta circunstância apenas error) como uma opção para shellcheck.

Final

Se não houver problemas com a lógica em um script, corre shellcheck antes de executar o script e corrigir todos os problemas detectados, uma execução quase perfeita será garantida na primeira tentativa. Você pode até usar o shellcheck nesse desafio de codificação para sua próxima entrevista de codificação ao vivo!! Nesta postagem, exploramos vários problemas que podem surgir em scripts e como shellcheck lida com eles.

Desfrute de scripts sem erros!

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.