sh alternatives and similar packages
Based on the "blackfriday" category.
Alternatively, view sh alternatives based on common mentions on social networks and blogs.
-
bluemonday
bluemonday: a fast golang HTML sanitizer (inspired by the OWASP Java HTML Sanitizer) to scrub user generated content of XSS -
go-pkg-rss
DISCONTINUED. This package reads RSS and Atom feeds and provides a caching mechanism that adheres to the feed specs. -
github_flavored_markdown
GitHub Flavored Markdown renderer with fenced code block highlighting, clickable header anchor links. -
go-pkg-xmlx
DISCONTINUED. Extension to the standard Go XML package. Maintains a node tree that allows forward/backwards browsing and exposes some simple single/multi-node search functions.
CodeRabbit: AI Code Reviews for Developers
Do you think we are missing an alternative of sh or a related project?
Popular Comparisons
README
sh
A shell parser, formatter, and interpreter. Supports POSIX Shell, Bash, and mksh. Requires Go 1.18 or later.
Quick start
To parse shell scripts, inspect them, and print them out, see the syntax examples.
For high-level operations like performing shell expansions on strings, see the shell examples.
shfmt
go install mvdan.cc/sh/v3/cmd/shfmt@latest
shfmt
formats shell programs. See [canonical.sh](syntax/canonical.sh) for a
quick look at its default style. For example:
shfmt -l -w script.sh
For more information, see [its manpage](cmd/shfmt/shfmt.1.scd), which can be viewed directly as Markdown or rendered with scdoc.
Packages are available on Alpine, Arch, Debian, Docker, Fedora, FreeBSD, Homebrew, MacPorts, NixOS, Scoop, Snapcraft, Void and webi.
gosh
go install mvdan.cc/sh/v3/cmd/gosh@latest
Proof of concept shell that uses interp
. Note that it's not meant to replace a
POSIX shell at the moment, and its options are intentionally minimalistic.
Fuzzing
We use Go's native fuzzing support. For instance:
cd syntax
go test -run=- -fuzz=ParsePrint
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
1:16: not a valid arithmetic operator: string
$ echo '${array[dash-string]}' | shfmt
${array[dash - string]}
$((
and((
ambiguity is not supported. Backtracking would complicate the parser and make streaming support viaio.Reader
impossible. The POSIX spec recommends to space the operands if$( (
is meant.
$ echo '$((foo); (bar))' | shfmt
1:1: reached ) without matching $(( with ))
- Some builtins like
export
andlet
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 supportdeclare foo=(bar)
. Note that this means expansions likedeclare {a,b}=c
are not supported.
JavaScript
A subset of the Go packages are available as an npm package called mvdan-sh. See the [_js](_js) directory for more information.
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>
Related projects
The following editor integrations wrap shfmt
:
- BashSupport-Pro - Bash plugin for JetBrains IDEs
- format-shell - Atom plugin
- intellij-shellcript - Intellij Jetbrains
shell script
plugin - micro - Editor with a built-in plugin
- shell-format - VS Code plugin
- vscode-shfmt - VS Code plugin
- shfmt.el - Emacs package
- Sublime-Pretty-Shell - Sublime Text 3 plugin
- Trunk - Universal linter, available as a CLI, VS Code plugin, and GitHub action
- vim-shfmt - Vim plugin
Other noteworthy integrations include:
- modd - A developer tool that responds to filesystem changes
- prettier-plugin-sh - Prettier plugin using mvdan-sh
- sh-checker - A GitHub Action that performs static analysis for shell scripts
- mdformat-shfmt - mdformat plugin to format shell scripts embedded in Markdown with shfmt
- pre-commit-shfmt - pre-commit shfmt hook