Sobre el proyecto

sh es un analizador, formateador e intérprete de shell escrito en Go puro, compatible con POSIX Shell, Bash, Zsh y mksh. Requiere Go 1.26 o posterior. El proyecto se organiza en tres paquetes principales. El paquete syntax analiza scripts de shell en un árbol de sintaxis, lo que permite inspeccionarlos y formatearlos de la misma manera que lo hace shfmt. El paquete shell ofrece ayudantes de una sola llamada con semántica de shell: dividir una línea de comandos en argumentos y volver a citarlos (similar a shlex), expandir $VAR y ~ dentro de cadenas, y aplicar globbing con ** o hacer coincidir patrones al estilo case. El paquete interp ejecuta scripts de shell sin un shell del sistema, incluso en Windows; sus manejadores permiten aislar lo que los scripts pueden ejecutar y acceder. shfmt es la parte más ampliamente utilizada del proyecto. Formatea programas de shell y puede instalarse mediante `go install mvdan.cc/sh/v3/cmd/shfmt@latest`. El uso típico es `shfmt -l -w script.sh`. Su estilo predeterminado se ilustra en syntax/canonical.sh, y se proporciona una página de manual. Los paquetes se distribuyen a través de muchos canales, incluidos Alpine, Arch, Debian, Docker, Fedora, FreeBSD, Homebrew, MacPorts, NixOS, OpenSUSE, PyPI, Scoop, Snapcraft, Void y webi. Se publican imágenes de Docker para las etiquetas de versión, con `v3` para la última estable y `latest` para desarrollo; las imágenes contienen solo shfmt, con variantes de Alpine disponibles. Entre las advertencias documentadas se incluyen: se requieren comillas al indexar arrays asociativos de Bash, ya que de lo contrario el analizador estático asume una expresión aritmética; no se admite la ambigüedad entre `$((` y `((` porque el backtracking complicaría el analizador e impediría el streaming mediante io.Reader; `export`, `let` y `declare` se analizan como palabras clave para permitir árboles de sintaxis estáticos y admitir formas como `declare foo=(bar)`; y, dado que la biblioteca es Go puro, el intérprete no puede coincidir por completo con la semántica de POSIX Shell y Bash; por ejemplo, los subshells usan goroutines en lugar de procesos bifurcados, por lo que no se usan directamente PIDs ni descriptores de archivos reales. Las preguntas frecuentes sobre el formateo indican que no se puede desactivar el formateo para rangos de líneas, que se evitan nuevas opciones de formateo siempre que sea posible y que se valora la consistencia por encima de satisfacer cada preferencia de estilo personal. Un paquete npm de terceros llamado sh-syntax incluye una compilación WASM del analizador y el formateador; el paquete más antiguo mvdan-sh basado en GopherJS está archivado. Entre las integraciones de editores y herramientas enumeradas se incluyen BashSupport-Pro, dockerfmt, intellij-shellscript, micro, neoformat, vscode-shfmt, shfmt.el, Trunk, modd, prettier-plugin-sh, sh-checker, mdformat-shfmt, pre-commit-shfmt y tesh. El README también señala que los parches de IA ocasionales no son útiles a menos que el colaborador sea un usuario o colaborador activo, y solicita issues detallados en su lugar.