À propos du projet

sh est un analyseur, formateur et interpréteur de shell écrit en pur Go, prenant en charge POSIX Shell, Bash, Zsh et mksh. Il nécessite Go 1.26 ou version ultérieure. Le projet est organisé en trois packages principaux. Le package syntax analyse les scripts shell en un arbre syntaxique, permettant l'inspection et le formatage de la même manière que shfmt. Le package shell offre des helpers d'appel unique avec la sémantique du shell : diviser une ligne de commande en arguments et la citer en retour (similaire à shlex), développer $VAR et ~ dans les chaînes, et le globbing avec ** ou la correspondance de motifs de type case. Le package interp exécute des scripts shell sans shell système, y compris sous Windows ; ses gestionnaires permettent de sandboxer ce que les scripts peuvent exécuter et accéder. shfmt est la partie la plus utilisée du projet. Il formate les programmes shell et peut être installé via `go install mvdan.cc/sh/v3/cmd/shfmt@latest`. L'utilisation typique est `shfmt -l -w script.sh`. Son style par défaut est illustré par syntax/canonical.sh, et une page man est fournie. Les packages sont distribués via de nombreux canaux, notamment Alpine, Arch, Debian, Docker, Fedora, FreeBSD, Homebrew, MacPorts, NixOS, OpenSUSE, PyPI, Scoop, Snapcraft, Void et webi. Les images Docker sont publiées pour les tags de version, avec `v3` pour la dernière version stable et `latest` pour le développement ; les images contiennent uniquement shfmt, avec des variantes Alpine disponibles. Les mises en garde documentées incluent : les guillemets sont nécessaires lors de l'indexation des tableaux associatifs Bash, car l'analyseur statique suppose sinon une expression arithmétique ; l'ambiguïté `$((` versus `((` n'est pas prise en charge car un retour arrière compliquerait l'analyseur et empêcherait le streaming via io.Reader ; `export`, `let` et `declare` sont analysés comme des mots-clés pour permettre des arbres syntaxiques statiques et prendre en charge des formes comme `declare foo=(bar)` ; et parce que la bibliothèque est en pur Go, l'interpréteur ne peut pas correspondre entièrement à la sémantique de POSIX Shell et Bash, par exemple les sous-shells utilisent des goroutines plutôt que des processus forkés, donc les vrais PIDs et descripteurs de fichiers ne sont pas utilisés directement. Les FAQ de formatage stipulent que le formatage ne peut pas être désactivé pour des plages de lignes, que de nouvelles options de formatage sont évitées lorsque possible, et que la cohérence est valorisée par rapport à la satisfaction de chaque préférence de style personnelle. Un package npm tiers appelé sh-syntax regroupe une build WASM de l'analyseur et du formateur ; l'ancien package mvdan-sh basé sur GopherJS est archivé. Les intégrations d'éditeurs et d'outils listées incluent BashSupport-Pro, dockerfmt, intellij-shellscript, micro, neoformat, vscode-shfmt, shfmt.el, Trunk, modd, prettier-plugin-sh, sh-checker, mdformat-shfmt, pre-commit-shfmt et tesh. Le README note également que les patchs AI inopinés ne sont pas utiles à moins que le contributeur soit un utilisateur ou contributeur actif, et demande des problèmes détaillés à la place.