Saltar al contenido principal

Estándar de scripting Bash (referencia)

Un script de Bash es una lista de comandos de terminal guardada en un archivo para ejecutarla de una sola vez. Un linter revisa ese archivo en busca de errores y malas prácticas; un formateador ordena el estilo (indentación, espacios) sin cambiar lo que hace. Esta nota dice qué herramienta se encarga de cada cosa.

Referencia del estándar de-facto de estilo, formateo y lint de scripts Bash, y de qué herramienta verifica cada regla. Es conocimiento de la industria (estable), no específico de Wiedii.

Las decisiones de enforcement/adaptación de Wiedii (flags del hook compartido, qué optional checks entran, mecanismo de sync, acciones en wiedii-configs) son una propuesta aparte, pendiente del TL — ver estandar-scripting-bash en el Inbox.

No hay un "PSR para Bash"

A diferencia de PHP (PHP-FIG + PSR), no existe un organismo ni una spec oficial de estilo shell. Lo único oficial es POSIX (IEEE Std 1003.1 / Open Group "Shell Command Language"), que define gramática y semántica, no estilo. El estándar de-facto es un stack de tres piezas sobre POSIX:

PiezaRolAnálogo
Google Shell Style GuideGuía de estilo (reglas humanas) — lo más cercano a "el PSR de Bash"PSR-12 / Airbnb
shfmt (mvdan/sh)Formateador (solo layout)Prettier
ShellCheckLinter (corrección/bugs, SC####) — NO formateaESLint / PHPStan

Matiz clave: shfmt por defecto indenta con tabs y usa su propio estilo canónico ("mvdan"), no el de Google; lee .editorconfig si no se le pasan flags. De las ~12 reglas Google, shfmt cubre solo la indentación. El peso del estilo lo lleva ShellCheck con sus optional checks activados (apagados por defecto).

Matriz de enforcement — qué herramienta cubre cada regla Google

Regla GoogleHerramienta + mecanismo¿Auto-fix?
1. Indent 2 espacios, sin tabsshfmt (vía .editorconfig)
2. Línea máx. 80.editorconfig max_line_length — advisory (editor)advisory
3. $() no backticksShellCheck SC2006detecta (fix vía -f diff)
4. [[ ]] no [ ]ShellCheck optional require-double-bracketsdetecta
5. Comillas / "$@"ShellCheck SC2086 / SC2048 / SC2068 (+ optional quote-safe-variables)detecta (SC2086 fix)
6. Llaves ${var}ShellCheck optional require-variable-braces (más estricto que Google)detecta
7. local + declarar/asignar aparteShellCheck SC2155detecta
8. snake_case / UPPER_SNAKE❌ ninguna → grep/CI propiomanual
9. Shebang #!/bin/bash, extensiones❌ ninguna → grep/CI propiomanual
10. Función main + main "$@"❌ ninguna → grep propiomanual
11. Chequeo de retornos / set -eShellCheck SC2181 (+ optionals check-set-e-suppressed, check-extra-masked-returns, add-default-case, deprecate-which)detecta
12. Shell solo si <~100 líneas❌ ninguna → wc -l en CImanual

Tres cubetas (según cómo se puede verificar):

  • (A) Auto-fixable: indent (shfmt); backticks y comillas básicas (shellcheck -f diff).
  • (B) Auto-detectable (bloquea, no arregla): [[ ]], comillas, ${}, local/SC2155, chequeo de retornos.
  • (C) Advisory / humano / check propio: línea 80 (advisory), naming, shebang/extensiones, main, regla de las ~100 líneas.

EditorConfig y ShellCheck NO se pueden "referenciar remoto"

A diferencia de lefthook (remotes:), no se puede consumir un .editorconfig/.shellcheckrc remoto. Verificado contra las specs:

  • EditorConfig: sin URL remota, sin extends/import/include. Resolución solo por búsqueda jerárquica ascendente hasta root = true; gana el más cercano. (spec.editorconfig.org)
  • editorconfig-checker (ec): su config tampoco soporta remoto/extends.
  • ShellCheck .shellcheckrc: búsqueda dir-arriba + fallback $HOME/.shellcheckrc; solo se usa el primero encontrado (override, no merge). Sin extends/include/remoto. (shellcheck.1.md)

Son formatos planos y locales por diseño. Difieren de lefthook remotes:, ESLint extends y Prettier shareable configs, que sí tienen capa de herencia/resolución. Por eso, para centralizar reglas de shell en Wiedii hace falta un mecanismo de sync (no de referencia) — ver la propuesta en estandar-scripting-bash.

Referencias