Header Ads

Usando shellcheck para localizar e corrigir erros de script

Shutterstock / MarcoVector

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

O que é shellcheck?

Se você já é um desenvolvedor Linux Bash há algum tempo, provavelmente encontrou um bom número de bugs em seus próprios scripts ou nos scripts de outros. A introdução de bugs no código está fadada a acontecer quando humanos estão desenvolvendo código. Mesmo os melhores desenvolvedores podem, de vez em quando, perder uma complexidade imprevista ou advertência em seu código.

No Bash, não existe um compilador real como existe, por exemplo, no C ++. No entanto, há um conjunto de ferramentas que podem ajudar muito no desenvolvimento de scripts Bash. Uma vez que tal ferramenta seja verificada. Este ótimo 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, por exemplo, a execução de um script com bash -x para ver cada comando no script sendo executado, e aquele em tempo real. O motivo é que o shellcheck analisará o script (arquivo) sem realmente executá-lo, novamente semelhante ao que um compilador faria.

Para obter mais informações sobre o bash -x, você pode ler o Bash Automation and Scripting Basics (Parte 3), que faz parte da série de 3 partes do Bash Automation and Scripting Basics.

Instalando o shellcheck

Para instalar o 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

Para instalar o 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

Executando verificação de shell

Depois de instalar o shellcheck, podemos fazer um teste simples com um script corrompido. Primeiro, definimos nosso script test. sh da seguinte maneira:

 #! / bin / wash echo 'Bash não é wash echo Mais erros para mim "if [-d ./directory}; do que echo' sure! < começar fif 

Quantos bugs você consegue encontrar? (Dica: são 8!).

Vamos ver a seguir o que o shellcheck faz desse código:

 shellcheck test. sh 

Imediatamente na primeira linha, ele encontra um problema com a especificação shebang. Se você ainda não ouviu falar do shebang, consulte nosso artigo Bash Automation and Scripting Basics Parte 1. Nossa linha de trocadilhos #! / Bin / wash deve ser #! / Bin / bash. Vamos corrigir isso. Problema 1/8 corrigido!

Ao mesmo tempo, também corrigiremos os outros dois problemas imediatamente reconhecidos pelo shellcheck: Você se esqueceu de fechar esta string entre aspas simples? para a segunda linha: local! Problema 2/8 corrigido. Para o terceiro problema, há um pouco de confusão quanto à nossa / a intenção dos desenvolvedores de shellcheck, e isso é esperado, já que 'na linha 2 abre uma string que só termina na linha 5 quando outra' é vista!

Como o terceiro problema é, portanto, o resultado do segundo problema, essa execução nos permitirá corrigir dois problemas por enquanto. Nosso script agora se parece com este:

 #! / bin / bash echo 'Bash não é lavado' echo Mais erros para mim "if [-d ./directory}; do que echo 'sure! < start fif 

Vamos executar o shellcheck novamente depois de fazer as correções e ver qual é o resultado.

Neste caso, o shellcheck vê que um "é aberto na linha 3 (embora esteja no final da linha, é na verdade uma aspa dupla de abertura como tal), e que mesmo no final do script (observe a linha 8 indicação, que não existe em nosso script de 6 linhas com uma única linha vazia após a última linha. Vamos limpar essa linha vazia e corrigir o problema de aspas duplas no início da linha 3, que agora pode ser facilmente compreendido. Problema 3/8 corrigido!

Nosso script agora se parece com isto:

 #! / bin / bash echo 'Bash não é lavado' echo "Mais erros para mim" if [-d ./directory}; do que eco 'com certeza! < começar fif 

Reexecutando o 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 estava nesta expressão if e teste esperado para terminar aqui. Faremos conforme sugerido e mudaremos o} para], fazendo com que a linha seja lida se [-d ./diretório]; que. Problema 4/8 corrigido! Nós reexecutamos o shellcheck e agora temos o seguinte:

Outro problema de aspas simples. Já sabemos como consertar isso. Vamos mudar o eco com certeza! < começa a ecoar 'com certeza!' < inicie (problema 5/8 corrigido!) e execute novamente o shellcheck mais uma vez:

Interessante no início, vemos que o shellcheck não é capaz de analisar uma linha. Considerando que isso pode parecer uma deficiência no shellcheck, lendo um pouco mais adiante, vemos que em algum lugar um then está faltando. Aha! Colocamos do que em vez de então. Que erro negligente 😉 Facilmente corrigido (problema 6/8 corrigido!). Nosso script agora se parece com este:

 #! / bin / bash echo 'Bash não é lavado' echo "Mais erros para mim" if [-d ./directory]; em seguida, ecoe 'com certeza!' < começar fif 

E outra execução do shellcheck nos fornece outra informação útil:

Falta um fi! Aha, sim, fif não vai servir. Mudamos fif para fi na última linha do script (problema 7/8) corrigido e executamos shellcheck mais uma vez!

Um problema de redirecionamento. Sinceramente, não esperava que o shellcheck também percebesse esse erro, pois < também pode ser usado no Bash, mas com certeza foi. Na verdade, nosso redirecionamento era para ser > em vez de & lt ;. Edição 8/8 – todos os problemas – fixo! Isso nos leva ao roteiro final

 #! / bin / bash echo 'Bash não é lavado' echo "Mais erros para mim" if [-d ./directory]; em seguida, ecoe 'com certeza!' > iniciar fi 

Vamos ver o que o shellcheck pensa disso agora.

Perfeito! E o script funciona perfeitamente, desde a primeira execução.

Se você revisar a saída dos vários comandos shellcheck, também notará outro recurso muito útil do shellcheck, especialmente para iniciantes: um conjunto de hiperlinks (links de sites) são exibidos, os quais podem ser clicados com o mouse de dentro da janela do terminal, ou você pode selecionar (se necessário) > clique com o botão direito para copiar e colar em um navegador. Clicar nesse link o levará ao projeto shellcheck do GitHub.

Com pressa?

Se quiser verificar rapidamente apenas as opções mais significativas, você pode dar uma olhada na opção --severity =, onde você substituiria por uma sem erro, aviso, informação, estilo.

Se você está apenas procurando erros e avisos, você usaria --severity = warning (que inclui níveis mais altos, neste caso sendo apenas um erro) como uma opção de verificação de shell.

Concluindo

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

Desfrute de scripts sem bugs!

Nenhum comentário