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
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.
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):
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:
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:
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:
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.
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 problemas – solucionados! 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.
¡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!