sh alternatives and similar packages
Based on the "blackfriday" category.
Alternatively, view sh alternatives based on common mentions on social networks and blogs.
-
GoQuery
GoQuery brings a syntax and a set of features similar to jQuery to the Go language. -
go-humanize
Formatters for time, numbers, and memory size to human readable format. -
go-pkg-rss
This package reads RSS and Atom feeds and provides a caching mechanism that adheres to the feed specs. -
go-pkg-xmlx
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. -
github_flavored_markdown
GitHub Flavored Markdown renderer with fenced code block highlighting, clickable header anchor links. -
editorconfig-core-go
Editorconfig file parser and manipulator for Go -
guesslanguage
Functions to determine the natural language of a unicode text.
Scout APM - Leading-edge performance monitoring starting at $39/month
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.14 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
GO111MODULE=on go get mvdan.cc/sh/v3/cmd/shfmt
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, Docker, FreeBSD, Homebrew, MacPorts, NixOS, Scoop, Snapcraft, and Void.
gosh
GO111MODULE=on go get mvdan.cc/sh/v3/cmd/gosh
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
This project makes use of go-fuzz to find crashes and hangs in both the parser
and the printer. Note that this requires Go 1.14.x at the moment, since go-fuzz
doesn't support 1.15 or later just yet. The fuzz-corpus
branch contains a
corpus to get you started. For example:
git checkout fuzz-corpus
PATH=$HOME/sdk/go1.14.9/bin:$PATH ./fuzz
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 is to allow statically parsing them and building their syntax tree, as opposed to just keeping the arguments as a slice of arguments.
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
To build a Docker image, checkout a specific version of the repository and run:
docker build -t my:tag -f cmd/shfmt/Dockerfile .
This creates an image that only includes shfmt. Alternatively, if you want an
image that includes alpine, add --target alpine
.
To use the Docker image, run:
docker run --rm -v $PWD:/mnt -w /mnt my:tag <shfmt arguments>
pre-commit
It is possible to use shfmt with pre-commit and a local
repo configuration like:
- repo: local
hooks:
- id: shfmt
name: shfmt
minimum_pre_commit_version: 2.4.0
language: golang
additional_dependencies: [mvdan.cc/sh/v3/cmd/[email protected]]
entry: shfmt
args: [-w]
types: [shell]
Related projects
The following editor integrations wrap shfmt
:
- format-shell - Atom plugin
- intellij-shellcript - Intellij Jetbrains
shell script
plugin - micro - Editor with a built-in plugin
- shell-format - VS Code plugin
- shfmt.el - Emacs package
- Sublime-Pretty-Shell - Sublime Text 3 plugin
- vim-shfmt - Vim plugin
Other noteworthy integrations include:
- Alternative docker image by PeterDaveHello
- 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