Sobre o projeto
sh é um analisador, formatador e interpretador de shell escrito em Go puro, com suporte a POSIX Shell, Bash, Zsh e mksh. Requer Go 1.26 ou superior.
O projeto está organizado em três pacotes principais. O pacote syntax analisa scripts de shell em uma árvore sintática, permitindo inspeção e formatação da mesma forma que o shfmt faz. O pacote shell oferece auxiliares de chamada única com semântica de shell: dividir uma linha de comando em argumentos e citá-los de volta (semelhante ao shlex), expandir $VAR e ~ dentro de strings, e corresponder padrões com ** ou case-style. O pacote interp executa scripts sem um shell do sistema, inclusive no Windows; seus handlers permitem sandboxing do que os scripts podem executar e acessar.
O shfmt é a parte mais amplamente utilizada do projeto. Ele formata programas de shell e pode ser instalado via `go install mvdan.cc/sh/v3/cmd/shfmt@latest`. O uso típico é `shfmt -l -w script.sh`. Seu estilo padrão é ilustrado por syntax/canonical.sh, e uma manpage é fornecida. Os pacotes são distribuídos por muitos canais, incluindo Alpine, Arch, Debian, Docker, Fedora, FreeBSD, Homebrew, MacPorts, NixOS, OpenSUSE, PyPI, Scoop, Snapcraft, Void e webi. Imagens Docker são publicadas para tags de release, com `v3` para a mais recente e `latest` para desenvolvimento; as imagens contêm apenas o shfmt, com variantes Alpine disponíveis.
Ressalvas documentadas incluem: aspas são necessárias ao indexar arrays associativos do Bash, pois o analisador estático caso contrário assume uma expressão aritmética; a ambiguidade entre `$((` e `((` não é suportada porque o backtracking complicaria o analisador e impediria o streaming via io.Reader; `export`, `let` e `declare` são analisados como palavras-chave para permitir árvores sintáticas estáticas e suportar formas como `declare foo=(bar)`; e, como a biblioteca é Go puro, o interpretador não consegue corresponder totalmente à semântica do POSIX Shell e do Bash, por exemplo, subshells usam goroutines em vez de processos bifurcados, então PIDs e descritores de arquivo reais não são usados diretamente.
As FAQs de formatação afirmam que a formatação não pode ser desabilitada para intervalos de linhas, que novas opções de formatação são evitadas sempre que possível e que a consistência é valorizada acima de satisfazer cada preferência pessoal de estilo.
Um pacote npm de terceiros chamado sh-syntax inclui uma build WASM do analisador e formatador; o pacote mvdan-sh mais antigo, baseado em GopherJS, está arquivado. Integrações de editores e ferramentas listadas incluem BashSupport-Pro, dockerfmt, intellij-shellscript, micro, neoformat, vscode-shfmt, shfmt.el, Trunk, modd, prettier-plugin-sh, sh-checker, mdformat-shfmt, pre-commit-shfmt e tesh. O README também observa que patches de IA casuais não são úteis a menos que o contribuidor seja um usuário ou contribuidor ativo, e pede issues detalhadas em vez disso.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.