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:
| Pieza | Rol | Análogo |
|---|---|---|
| Google Shell Style Guide | Guía de estilo (reglas humanas) — lo más cercano a "el PSR de Bash" | PSR-12 / Airbnb |
shfmt (mvdan/sh) | Formateador (solo layout) | Prettier |
| ShellCheck | Linter (corrección/bugs, SC####) — NO formatea | ESLint / 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 Google | Herramienta + mecanismo | ¿Auto-fix? |
|---|---|---|
| 1. Indent 2 espacios, sin tabs | shfmt (vía .editorconfig) | ✅ |
| 2. Línea máx. 80 | .editorconfig max_line_length — advisory (editor) | advisory |
3. $() no backticks | ShellCheck SC2006 | detecta (fix vía -f diff) |
4. [[ ]] no [ ] | ShellCheck optional require-double-brackets | detecta |
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 aparte | ShellCheck SC2155 | detecta |
| 8. snake_case / UPPER_SNAKE | ❌ ninguna → grep/CI propio | manual |
9. Shebang #!/bin/bash, extensiones | ❌ ninguna → grep/CI propio | manual |
10. Función main + main "$@" | ❌ ninguna → grep propio | manual |
11. Chequeo de retornos / set -e | ShellCheck 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 CI | manual |
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 hastaroot = 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). Sinextends/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
- Google Shell Style Guide · shfmt (mvdan/sh) · ShellCheck · Optional checks
- SC2006 · SC2155 · SC2181
- EditorConfig spec · editorconfig-checker · POSIX Shell Command Language
- linters · lefthook · wiedii-configs · propuesta de enforcement: estandar-scripting-bash