Windows

A shell parser, formatter, and interpreter with bash and zsh support; includes shfmt

goparsershellbashformatterposixmkshinterpreterbeautifyshfmtzsh
Croissance des étoiles
Étoiles
9k
Forks
451
Croissance hebdomadaire
+12
Issues
89
5k
juin 2016nov. 2019avr. 2023sept. 2026
ArtefactsGo Modules
README

sh

Go Reference

A shell parser, formatter, and interpreter. Supports POSIX Shell, Bash, Zsh, and mksh. Requires Go 1.26 or later.

Quick start

To parse shell scripts into a syntax tree, inspect them, and format them like shfmt does, see the syntax package.

For one-call helpers with shell semantics, see the shell package: split a command line into arguments and quote them back like shlex, expand $VAR and ~ in strings, and glob with ** or match case-style patterns.

To run shell scripts without a system shell, including on Windows, see the interp package; its handlers allow sandboxing what scripts can execute and access.

shfmt

go install mvdan.cc/sh/v3/cmd/shfmt@latest

shfmt formats shell programs. See canonical.sh for a quick look at its default style. For example:

shfmt -l -w script.sh

For more information, see its manpage, which can be viewed directly as Markdown or rendered with scdoc.

Packages are available on Alpine, Arch, Debian, Docker, Fedora, FreeBSD, Homebrew, MacPorts, NixOS, OpenSUSE, PyPI, Scoop, Snapcraft, Void and webi.

Sponsoring

If this project saves you or your company time, consider sponsoring me on GitHub. Monthly tiers include benefits like your logo on a README, prioritized issues, or direct support in your company's chat app. One-time tiers offer a call about one of my projects or a Go consulting or mentorship session.

Contributing

Bug reports and feature requests should be filed as detailed issues, ideally with an example which reproduces the bug or shows what feature you're after.

Unless you're an active user or contributor to the project, drive-by AI patches are not helpful. File detailed issues instead.

Caveats

  • When indexing Bash associative arrays, always use quotes. The static parser will otherwise have to assume that the index is an arithmetic expression.
$ echo '${array[spaced string]}' | shfmt
<standard input>:1:16: not a valid arithmetic operator: `string`
$ echo '${array[weird!key]}' | shfmt
<standard input>:1:8: reached `!` without matching `[` with `]`
$ echo '${array[dash-string]}' | shfmt
${array[dash - string]}
  • $(( and (( ambiguity is not supported. Backtracking would complicate the parser and make streaming support via io.Reader impossible. The POSIX spec recommends to space the operands if $( ( is meant.
$ echo '$((foo); (bar))' | shfmt
1:1: reached ) without matching $(( with ))
  • export, let, and declare are parsed as keywords. This allows statically building their syntax tree, as opposed to keeping the arguments as a slice of words. It is also required to support declare foo=(bar).

  • The entire library is written in pure Go, which limits how closely the interpreter can follow POSIX Shell and Bash semantics. For example, Go does not support forking its own process, so subshells use a goroutine instead, meaning that real PIDs and file descriptors cannot be used directly.

Formatting FAQs

  • The formatter cannot be disabled for ranges of lines; most users wanting this are working around a bug or they don't like how a piece of code is formatted. Instead, search the issue tracker and file a new issue if necessary. Formatting of partial files leads to lots of edge cases and complexity which this project has no resources for, nor interest in, getting into.

  • We avoid adding more formatting options where possible. Each added flag interacts with all others, multiplying the human cost of development, maintenance, testing, and properly documenting the behavior for end users.

  • The true value in a formatter is consistency, especially for teams of developers. We do not aim to satisfy every developer's personal choice of optimal formatting.

JavaScript

The parser and formatter are available as a third party npm package called sh-syntax, which bundles a version of this library compiled to WASM.

Previously, we maintained an npm package called mvdan-sh which used GopherJS to bundle a JS version of this library. That npm package is now archived given its poor performance and GopherJS not being as actively developed. Any existing or new users should look at sh-syntax instead.

Docker

All release tags are published via Docker, such as v3.5.1. The latest stable release is currently published as v3, and the latest development version as latest. The images only include shfmt; -alpine variants exist on Alpine Linux.

To build a Docker image, run:

docker build -t my:tag -f cmd/shfmt/Dockerfile .

To use a Docker image, run:

docker run --rm -u "$(id -u):$(id -g)" -v "$PWD:/mnt" -w /mnt my:tag <shfmt arguments>

The following editor integrations wrap shfmt:

Other noteworthy integrations include:

Dépôts similaires
avelino/awesome-go

A curated list of awesome Go frameworks, libraries and software

GoGo ModulesawesomeMIT Licensegolanggolang-library
awesome-go.com
183.7k13.6k
ollama/ollama

Get up and running with Kimi-K2.6, GLM-5.2, MiniMax, DeepSeek, gpt-oss, Qwen, Gemma and other models.

GoGo ModulesMIT Licensellamallm
ollama.com
180.5k17.8k
golang/go

The Go programming language

GoGo ModulesBSD 3-Clause "New" or "Revised" Licenseprogramming-languagelanguage
go.dev
138k19.3k
kubernetes/kubernetes

Production-Grade Container Scheduling and Management

GoGo ModulesApache License 2.0kubernetesgo
kubernetes.io
126.9k44k
fatedier/frp

A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.

GoGo ModulesApache License 2.0proxyreverse-proxy
109.3k15.2k
gohugoio/hugo

The world’s fastest framework for building websites.

GoGo ModuleslibraryApache License 2.0gohugo
gohugo.io
89.8k8.4k
gin-gonic/gin

Gin is a high-performance HTTP web framework written in Go. It provides a Martini-like API but with significantly better performance—up to 40 times faster—thanks to httprouter. Gin is designed for building REST APIs, web applications, and microservices.

GoGo ModuleslibraryMIT Licenseservermiddleware
gin-gonic.com
89.2k8.7k
syncthing/syncthing

Open Source Continuous File Synchronization

GoGo ModulesappMozilla Public License 2.0synchronizationgo
syncthing.net
88.4k5.5k
junegunn/fzf

:cherry_blossom: A command-line fuzzy finder

GoGo ModulescliMIT Licensefzfgo
junegunn.github.io/fzf/
82.9k2.9k
grafana/grafana

The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.

TypeScriptnpmGNU Affero General Public License v3.0grafanamonitoring
grafana.com
76.7k14.7k
caddyserver/caddy

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

GoGo ModulesApache License 2.0goweb-server
caddyserver.com
75.6k4.9k
moby/moby

The Moby Project - a collaborative project for the container ecosystem to assemble container-based systems

GoGo ModulesApache License 2.0dockercontainers
mobyproject.org
72.1k19.2k