5 pontos por GN⁺ 2023-11-25 | 1 comentários | Compartilhar no WhatsApp

Introdução ao ShellCheck

  • ShellCheck é uma ferramenta que encontra bugs em scripts de shell.
  • Pode ser instalado localmente via cabal, apt, dnf, pkg e brew.
  • Ao colar um script, o ShellCheck exibe os resultados da análise.

Recursos do ShellCheck

  • O ShellCheck pode ser usado livremente sob a licença GPLv3.
  • Está documentado na Wiki do ShellCheck, e o código-fonte pode ser consultado no GitHub.
  • Já vem empacotado na maioria das distribuições ou gerenciadores de pacotes.
  • É suportado como linter integrado nos principais editores, e o código de repositórios no GitHub pode ser verificado automaticamente via CodeClimate, Codacy e CodeFactor.
  • Foi escrito em Haskell, sendo adequado para usuários que tenham interesse nessa linguagem.

Agradecimentos

  • Agradecimentos especiais aos apoiadores no GitHub Sponsors: Gitpod, Mercedes-Benz, BashSupport Pro, per1234, WhitewaterFoundry, cavcrosby, dcminter, photostructure, Cronitor, djdefi, steve-chavez e outros.

Opinião do GN⁺

  • O ponto mais importante deste artigo é que o ShellCheck é uma ferramenta útil para encontrar bugs em scripts de shell.
  • O fato de o ShellCheck ser gratuito, suportado em várias plataformas e editores, e fácil de usar pode ser interessante para muitas pessoas.
  • Em especial, o apoio da comunidade de código aberto e o fato de ter sido desenvolvido em Haskell podem torná-lo atraente para desenvolvedores de software.

1 comentários

 
GN⁺ 2023-11-25
Comentários no Hacker News
  • Cuidados ao escrever scripts

    • Recomenda-se usar a opção -u (nounset) para gerar erro ao usar variáveis não declaradas. A exceção é quando, na expansão de arrays, um array vazio é considerado unbound.
    • É possível tentar uma execução simulada (dry-run) usando a opção -n (noexec) para impedir a execução de comandos.
    • A opção -e (errexit) também é útil, mas é preciso ter em mente que apenas comandos “naked” que falham provocam a saída. Para evitar isso, prefere-se adicionar || fail "..." ao comando.
  • Descoberta de vulnerabilidade em shell scripts

    • Foi descoberta uma vulnerabilidade de elevação de privilégio por meio de expansão aritmética. Por exemplo, se for possível controlar $ENV_VAR em $((1 + ENV_VAR)), dá para injetar código.
    • O Shellcheck não detecta isso na configuração padrão. Ao implementar funcionalidades críticas de segurança, é melhor não usar shell.
  • Shellcheck e strictbash

    • O Shellcheck é muito útil.
    • O strictbash é um wrapper que executa o Shellcheck antes de rodar o script, impedindo a execução se houver erros. Ele também ativa todas as flags de “strict mode” do Bash.
  • Menções ao Shellcheck

    • Há muitas menções ao Shellcheck, e a última grande discussão aconteceu em 2021.
  • Uso de Haskell e Turtle

    • Ao converter scripts de deploy usando Haskell com a biblioteca Turtle, foi possível reduzir bastante a duplicação.
    • Como resultado, o código ficou muito mais curto.
  • Uso de Shellcheck e linters

    • Segue-se o princípio de “corrigir todos os avisos antes de fazer commit”, incluindo Shellcheck e outros linters na configuração de pre-commit.
    • A maioria dos shell scripts está incluída em arquivos .gitlab-ci.yml, o que dificulta a verificação. Foi criado um wrapper para inspecioná-los automaticamente.
  • Servidor de linguagem para Bash

    • Também existe um servidor de linguagem para Bash.
  • Efeito de aprendizado do Shellcheck

    • Ao usar o Shellcheck para verificar o primeiro script /bin/sh de produção, aprendeu-se algo novo apesar da experiência escrevendo scripts desde os anos 80.
  • Recomendação de uso do Bach

    • Recomenda-se usar Bach quando for necessário usar Bash. Usar Bash para tarefas longas o suficiente pode não ser apropriado.
  • Shellcheck e tratamento de source/import

    • O Shellcheck é excelente, mas lidar com source ou import é muito incômodo. Esse é um problema que surge porque sh é um pesadelo.