5 puntos por GN⁺ 2023-11-25 | 1 comentarios | Compartir por WhatsApp

Introducción a ShellCheck

  • ShellCheck es una herramienta que encuentra errores en scripts de shell.
  • Se puede instalar en un entorno local mediante cabal, apt, dnf, pkg y brew.
  • Al pegar un script, ShellCheck muestra el resultado del análisis.

Características de ShellCheck

  • ShellCheck se puede usar libremente bajo la licencia GPLv3.
  • Está documentado en la wiki de ShellCheck, y el código fuente se puede consultar en GitHub.
  • Ya viene empaquetado en la mayoría de las distribuciones o gestores de paquetes.
  • Es compatible como linter integrado en los principales editores, y puede revisar automáticamente el código de repositorios de GitHub mediante CodeClimate, Codacy y CodeFactor.
  • Está escrito en Haskell, por lo que resulta adecuado para usuarios interesados en ese lenguaje.

Agradecimientos

  • Expresa un agradecimiento especial a GitHub Sponsors: Gitpod, Mercedes-Benz, BashSupport Pro, per1234, WhitewaterFoundry, cavcrosby, dcminter, photostructure, Cronitor, djdefi, steve-chavez y otros.

Opinión de GN⁺

  • Lo más importante de este artículo es que ShellCheck es una herramienta útil para encontrar errores en scripts de shell.
  • A la gente le puede resultar interesante que ShellCheck sea gratuito, esté disponible en varias plataformas y editores, y sea fácil de usar.
  • En particular, el apoyo de la comunidad de código abierto y el hecho de que esté desarrollado en Haskell pueden resultar atractivos para los desarrolladores de software.

1 comentarios

 
GN⁺ 2023-11-25
Comentarios de Hacker News
  • Precauciones al escribir scripts

    • Se recomienda usar la opción -u (nounset) para que se produzca un error al usar variables no declaradas. Una excepción es cuando, al expandir arreglos, un arreglo vacío se considera unbound.
    • Se puede intentar una ejecución simulada (dry-run) usando la opción -n (noexec) para evitar ejecutar comandos.
    • La opción -e (errexit) también es útil, pero hay que tener en cuenta que solo los comandos "desnudos" que fallen provocan la salida. Para evitar esto, se prefiere agregar || fail "..." al comando.
  • Descubrimiento de vulnerabilidades en scripts de shell

    • Se descubrió una vulnerabilidad de escalamiento de privilegios mediante expansión aritmética. Por ejemplo, si se puede controlar $ENV_VAR a través de $((1 + ENV_VAR)), se puede inyectar código.
    • Shellcheck no detecta esto con la configuración predeterminada. Cuando se implementan funciones críticas para la seguridad, es mejor no usar shell.
  • Shellcheck y strictbash

    • Shellcheck es muy útil.
    • strictbash es un wrapper que ejecuta Shellcheck antes de correr el script, e impide que el script se ejecute si hay errores. Además, establece todas las banderas de "strict mode" de Bash.
  • Menciones sobre Shellcheck

    • Hay muchas menciones sobre Shellcheck, y la última gran discusión fue en 2021.
  • Uso de Haskell y Turtle

    • Al convertir scripts de despliegue usando Haskell junto con la librería Turtle, se redujo mucho la duplicación.
    • Como resultado, el código quedó mucho más corto.
  • Uso de Shellcheck y linters

    • Se sigue el principio de "hacer commit solo después de corregir todas las advertencias", e incluir Shellcheck y otros linters en la configuración de pre-commit.
    • La mayoría de los scripts de shell están incluidos dentro de archivos .gitlab-ci.yml, por lo que es difícil revisarlos. Se creó un wrapper para inspeccionarlos automáticamente.
  • Servidor de lenguaje para Bash

    • También existe un servidor de lenguaje para Bash.
  • Efecto de aprendizaje de Shellcheck

    • Al usar Shellcheck para revisar el primer script de producción en /bin/sh, se aprendieron cosas nuevas a pesar de llevar escribiendo scripts desde los años 80.
  • Recomendación de uso de Bach

    • Cuando haya que usar Bash, se recomienda usar Bach. Puede que usar Bash para tareas lo suficientemente largas no sea apropiado.
  • Shellcheck y el manejo de source/import

    • Shellcheck es excelente, pero manejar source o imports es muy engorroso. Esto ocurre porque sh es una pesadilla.