{"id":13413974,"url":"https://github.com/mvdan/sh","last_synced_at":"2026-07-25T07:01:03.431Z","repository":{"id":37412677,"uuid":"49766020","full_name":"mvdan/sh","owner":"mvdan","description":"A shell parser, formatter, and interpreter with bash and zsh support; includes shfmt","archived":false,"fork":false,"pushed_at":"2026-07-23T14:20:34.000Z","size":5983,"stargazers_count":8914,"open_issues_count":105,"forks_count":431,"subscribers_count":55,"default_branch":"master","last_synced_at":"2026-07-23T15:08:06.904Z","etag":null,"topics":["bash","beautify","formatter","go","interpreter","mksh","parser","posix","shell","shfmt","zsh"],"latest_commit_sha":null,"homepage":"https://pkg.go.dev/mvdan.cc/sh/v3","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mvdan.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"mvdan"}},"created_at":"2016-01-16T08:39:09.000Z","updated_at":"2026-07-23T14:22:10.000Z","dependencies_parsed_at":"2022-07-08T02:58:16.440Z","dependency_job_id":"d7a83068-0263-41a9-bb6c-c8dc79cbd5af","html_url":"https://github.com/mvdan/sh","commit_stats":{"total_commits":3618,"total_committers":82,"mean_commits":44.1219512195122,"dds":"0.050027639579878436","last_synced_commit":"793d36450a0a5a466199b04c458fb4a1202cf641"},"previous_names":[],"tags_count":62,"template":false,"template_full_name":null,"purl":"pkg:github/mvdan/sh","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdan%2Fsh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdan%2Fsh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdan%2Fsh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdan%2Fsh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mvdan","download_url":"https://codeload.github.com/mvdan/sh/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdan%2Fsh/sbom","scorecard":{"id":669311,"data":{"date":"2025-08-11","repo":{"name":"github.com/mvdan/sh","commit":"10c1e4af0f4e6b2497c2344d5507f923de0f6592"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.3,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 11 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":2,"reason":"Found 6/29 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:48: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:89: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:103: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:126: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:135: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:187: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:215: update your workflow using https://app.stepsecurity.io/secureworkflow/mvdan/sh/test.yml/master?enable=pin","Warn: containerImage not pinned by hash: cmd/shfmt/Dockerfile:1","Warn: containerImage not pinned by hash: cmd/shfmt/Dockerfile:8","Warn: goCommand not pinned by hash: .github/workflows/test.yml:27","Info:   0 out of   4 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   6 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   0 out of   1 goCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: GoBuiltInFuzzer integration found: syntax/fuzz_test.go:16","Info: GoBuiltInFuzzer integration found: syntax/fuzz_test.go:94"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Warn: 'branch protection settings apply to administrators' is disabled on branch 'master'","Warn: 'stale review dismissal' is disabled on branch 'master'","Warn: branch 'master' does not require approvers","Warn: codeowners review is not required on branch 'master'","Warn: 'last push approval' is disabled on branch 'master'","Warn: no status checks found to merge onto branch 'master'","Info: PRs are required in order to make changes on branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v3.12.0 not signed: https://api.github.com/repos/mvdan/sh/releases/230311117","Warn: release artifact v3.11.0 not signed: https://api.github.com/repos/mvdan/sh/releases/203975620","Warn: release artifact v3.10.0 not signed: https://api.github.com/repos/mvdan/sh/releases/180899824","Warn: release artifact v3.9.0 not signed: https://api.github.com/repos/mvdan/sh/releases/170680716","Warn: release artifact v3.8.0 not signed: https://api.github.com/repos/mvdan/sh/releases/141532654","Warn: release artifact v3.12.0 does not have provenance: https://api.github.com/repos/mvdan/sh/releases/230311117","Warn: release artifact v3.11.0 does not have provenance: https://api.github.com/repos/mvdan/sh/releases/203975620","Warn: release artifact v3.10.0 does not have provenance: https://api.github.com/repos/mvdan/sh/releases/180899824","Warn: release artifact v3.9.0 does not have provenance: https://api.github.com/repos/mvdan/sh/releases/170680716","Warn: release artifact v3.8.0 does not have provenance: https://api.github.com/repos/mvdan/sh/releases/141532654"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/test.yml:52"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 7 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T19:23:19.522Z","repository_id":37412677,"created_at":"2025-08-21T19:23:19.522Z","updated_at":"2025-08-21T19:23:19.522Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35868704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-25T02:00:06.922Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bash","beautify","formatter","go","interpreter","mksh","parser","posix","shell","shfmt","zsh"],"created_at":"2024-07-30T20:01:54.169Z","updated_at":"2026-07-25T07:01:03.424Z","avatar_url":"https://github.com/mvdan.png","language":"Go","funding_links":["https://github.com/sponsors/mvdan"],"categories":["语言资源库","Go","Misc","开源类库","Text Processing","Shell Script Development","Open source library","Containers \u0026 Language Extentions \u0026 Linting","Linters","终端","bash","go","Programming","Template Engines","文本处理`解析和操作文本的代码库`","Bot Building","文本处理","Productivity tools","Shell","\u003cspan id=\"文字处理-text-processing\"\u003e文字处理 Text Processing\u003c/span\u003e","Specific Formats","DevOps","tools","Analysis","文本處理"],"sub_categories":["go","解释器","Parsers/Encoders/Decoders","Directory Navigation","HTTP Clients","Interpreter","For Go","Shell","网络服务_其他","Linters / Formaters \u003c!-- omit in toc --\u003e","查询语","Advanced Console UIs","解析 器/Encoders/Decoders","Chess :chess_pawn:","\u003cspan id=\"高级控制台用户界面-advanced-console-uis\"\u003e高级控制台用户界面 Advanced Console UIs\u003c/span\u003e","交流","Reusable Things","高级控制台界面","高級控制台界面"],"readme":"# sh\n\n[![Go Reference](https://pkg.go.dev/badge/mvdan.cc/sh/v3.svg)](https://pkg.go.dev/mvdan.cc/sh/v3)\n\nA shell parser, formatter, and interpreter.\nSupports [POSIX Shell], [Bash], [Zsh], and [mksh]. Requires Go 1.25 or later.\n\n### Quick start\n\nTo parse shell scripts, inspect them, and print them out,\nsee the [syntax package](https://pkg.go.dev/mvdan.cc/sh/v3/syntax).\n\nFor high-level operations like performing shell expansions on strings,\nsee the [shell package](https://pkg.go.dev/mvdan.cc/sh/v3/shell).\n\nTo interpret or run shell scripts,\nsee the [interp package](https://pkg.go.dev/mvdan.cc/sh/v3/interp).\n\n### shfmt\n\n\tgo install mvdan.cc/sh/v3/cmd/shfmt@latest\n\n`shfmt` formats shell programs. See [canonical.sh](syntax/canonical.sh) for a\nquick look at its default style. For example:\n\n\tshfmt -l -w script.sh\n\nFor more information, see [its manpage](cmd/shfmt/shfmt.1.scd), which can be\nviewed directly as Markdown or rendered with [scdoc].\n\nPackages are available on [Alpine], [Arch], [Debian], [Docker], [Fedora], [FreeBSD],\n[Homebrew], [MacPorts], [NixOS], [OpenSUSE], [Scoop], [Snapcraft], [Void] and [webi].\n\n### gosh\n\n\tgo install mvdan.cc/sh/v3/cmd/gosh@latest\n\nProof of concept shell that uses the `interp` package.\n\n### Fuzzing\n\nWe use Go's native fuzzing support. For instance:\n\n\tcd syntax\n\tgo test -run=- -fuzz=ParsePrint\n\n### Caveats\n\n* When indexing Bash associative arrays, always use quotes. The static parser\n  will otherwise have to assume that the index is an arithmetic expression.\n\n```sh\n$ echo '${array[spaced string]}' | shfmt\n\u003cstandard input\u003e:1:16: not a valid arithmetic operator: `string`\n$ echo '${array[weird!key]}' | shfmt\n\u003cstandard input\u003e:1:8: reached `!` without matching `[` with `]`\n$ echo '${array[dash-string]}' | shfmt\n${array[dash - string]}\n```\n\n* `$((` and `((` ambiguity is not supported. Backtracking would complicate the\n  parser and make streaming support via `io.Reader` impossible. The POSIX spec\n  recommends to [space the operands][posix-ambiguity] if `$( (` is meant.\n\n```sh\n$ echo '$((foo); (bar))' | shfmt\n1:1: reached ) without matching $(( with ))\n```\n\n* `export`, `let`, and `declare` are parsed as keywords.\n  This allows statically building their syntax tree,\n  as opposed to keeping the arguments as a slice of words.\n  It is also required to support `declare foo=(bar)`.\n\n* The entire library is written in pure Go, which limits how closely the\n  interpreter can follow POSIX Shell and Bash semantics.\n  For example, Go does not support forking its own process, so subshells\n  use a goroutine instead, meaning that real PIDs and file descriptors\n  cannot be used directly.\n\n### Formatting FAQs\n\n* The formatter cannot be disabled for ranges of lines; most users wanting this\n  are working around a bug or they don't like how a piece of code is formatted.\n  Instead, search the issue tracker and file a new issue if necessary.\n  Formatting of partial files leads to lots of edge cases and complexity\n  which this project has no resources for, nor interest in, getting into.\n\n* We avoid adding more formatting options where possible. Each added flag interacts\n  with all others, multiplying the human cost of development, maintenance, testing,\n  and properly documenting the behavior for end users.\n\n* The true value in a formatter is consistency, especially for teams of developers.\n  We do not aim to satisfy every developer's personal choice of optimal formatting.\n\n### JavaScript\n\nThe parser and formatter are available as a third party npm package called [sh-syntax],\nwhich bundles a version of this library compiled to WASM.\n\nPreviously, we maintained an npm package called [mvdan-sh] which used GopherJS\nto bundle a JS version of this library. That npm package is now archived\ngiven its poor performance and GopherJS not being as actively developed.\nAny existing or new users should look at [sh-syntax] instead.\n\n### Docker\n\nAll release tags are published via [Docker], such as `v3.5.1`.\nThe latest stable release is currently published as `v3`,\nand the latest development version as `latest`.\nThe images only include `shfmt`; `-alpine` variants exist on Alpine Linux.\n\nTo build a Docker image, run:\n\n\tdocker build -t my:tag -f cmd/shfmt/Dockerfile .\n\nTo use a Docker image, run:\n\n\tdocker run --rm -u \"$(id -u):$(id -g)\" -v \"$PWD:/mnt\" -w /mnt my:tag \u003cshfmt arguments\u003e\n\n### Related projects\n\nThe following editor integrations wrap `shfmt`:\n\n- [BashSupport-Pro] - Bash plugin for JetBrains IDEs\n- [dockerfmt] - Dockerfile formatter using shfmt\n- [intellij-shellscript] - Intellij Jetbrains `shell script` plugin\n- [micro] - Editor with a built-in plugin\n- [neoformat] - (Neo)Vim plugin\n- [shell-format] - VS Code plugin\n- [vscode-shfmt] - VS Code plugin\n- [shfmt.el] - Emacs package\n- [Sublime-Pretty-Shell] - Sublime Text 3 plugin\n- [Trunk] - Universal linter, available as a CLI, VS Code plugin, and GitHub action\n- [vim-shfmt] - Vim plugin\n\nOther noteworthy integrations include:\n\n- [modd] - A developer tool that responds to filesystem changes\n- [prettier-plugin-sh] - [Prettier] plugin using [sh-syntax]\n- [sh-checker] - A GitHub Action that performs static analysis for shell scripts\n- [mdformat-shfmt] - [mdformat] plugin to format shell scripts embedded in Markdown with shfmt\n- [pre-commit-shfmt] - [pre-commit] shfmt hook\n- [tesh] - Run scripts with mocks, assertions, and coverage\n\n[alpine]: https://pkgs.alpinelinux.org/packages?name=shfmt\n[arch]: https://archlinux.org/packages/extra/x86_64/shfmt/\n[bash]: https://www.gnu.org/software/bash/\n[BashSupport-Pro]: https://www.bashsupport.com/manual/editor/formatter/\n[debian]: https://tracker.debian.org/pkg/golang-mvdan-sh\n[docker]: https://hub.docker.com/r/mvdan/shfmt/\n[dockerfmt]: https://github.com/reteps/dockerfmt\n[editorconfig]: https://editorconfig.org/\n[examples]: https://pkg.go.dev/mvdan.cc/sh/v3/syntax#pkg-examples\n[fedora]: https://packages.fedoraproject.org/pkgs/golang-mvdan-sh-3/shfmt/\n[freebsd]: https://www.freshports.org/devel/shfmt\n[homebrew]: https://formulae.brew.sh/formula/shfmt\n[intellij-shellscript]: https://www.jetbrains.com/help/idea/shell-scripts.html\n[macports]: https://ports.macports.org/port/shfmt/details/\n[mdformat-shfmt]: https://github.com/hukkin/mdformat-shfmt\n[mdformat]: https://github.com/executablebooks/mdformat\n[micro]: https://micro-editor.github.io/\n[mksh]: http://www.mirbsd.org/mksh.htm\n[modd]: https://github.com/cortesi/modd\n[mvdan-sh]: https://www.npmjs.com/package/mvdan-sh\n[neoformat]: https://github.com/sbdchd/neoformat\n[nixos]: https://github.com/NixOS/nixpkgs/blob/HEAD/pkgs/tools/text/shfmt/default.nix\n[OpenSUSE]: https://build.opensuse.org/package/show/openSUSE:Factory/shfmt\n[posix shell]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html\n[posix-ambiguity]: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03\n[pre-commit]: https://pre-commit.com\n[pre-commit-shfmt]: https://github.com/scop/pre-commit-shfmt\n[prettier-plugin-sh]: https://github.com/un-ts/prettier/tree/master/packages/sh\n[prettier]: https://prettier.io\n[scdoc]: https://sr.ht/~sircmpwn/scdoc/\n[scoop]: https://github.com/ScoopInstaller/Main/blob/HEAD/bucket/shfmt.json\n[sh-checker]: https://github.com/luizm/action-sh-checker\n[sh-syntax]: https://github.com/un-ts/sh-syntax\n[shell-format]: https://marketplace.visualstudio.com/items?itemName=foxundermoon.shell-format\n[shfmt.el]: https://github.com/purcell/emacs-shfmt/\n[snapcraft]: https://snapcraft.io/shfmt\n[sublime-pretty-shell]: https://github.com/aerobounce/Sublime-Pretty-Shell\n[tesh]: https://github.com/feloy/tesh\n[trunk]: https://trunk.io/check\n[vim-shfmt]: https://github.com/z0mbix/vim-shfmt\n[void]: https://github.com/void-linux/void-packages/blob/HEAD/srcpkgs/shfmt/template\n[vscode-shfmt]: https://marketplace.visualstudio.com/items?itemName=mkhl.shfmt\n[webi]: https://webinstall.dev/shfmt/\n[Zsh]: https://www.zsh.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmvdan%2Fsh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmvdan%2Fsh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmvdan%2Fsh/lists"}