Mvdan Sh Versions Save

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

v3.8.0

2 months ago

This release drops support for Go 1.19 and 1.20 and includes many features and bugfixes, such as improving EditorConfig support in shfmt.

  • cmd/shfmt
    • Support EditorConfig language sections such as [[shell]] - #664
    • Add --apply-ignore for tools and editors - #1037
  • syntax
    • Allow formatting redirects before all command argumetnts - #942
    • Support brace expansions with uppercase letters - #1042
    • Unescape backquotes in single quotes within backquotes - #1041
    • Better error when using function in POSIX mode - #993
    • Better column numbers for escapes inside backquotes - #1028
  • interp
    • Support parentheses in classic test commands - #1036
    • Determine access to a directory via unix.Access - #1033
    • Support subshells with FuncEnviron as Env - #1043
    • Add support for fs.DirEntry via ReadDirHandler2
  • expand
    • Add support for fs.DirEntry via ReadDir2
    • Support zero-padding in brace expansions - #1042

A special thanks to all the contributors to this release! @theclapp @slabstone @MaienM

Consider becoming a sponsor if you benefit from the work that went into this release!

Binaries built on go version go1.22.0 linux/amd64 with:

CGO_ENABLED=0 go build -trimpath -ldflags="-w -s -X=main.version=v3.8.0"

v3.7.0

10 months ago

This release drops support for Go 1.18 and includes many features and fixes.

  • syntax
    • Correctly parse $foo#bar as a single word - #1003
    • Make &> redirect operators an error in POSIX mode - #991
    • Avoid producing invalid shell when minifying some heredocs - #923
    • Revert the simplification of ${foo:-} into ${foo-} - #970
  • interp
    • Add ExecHandlers to support layering multiple middlewares - #964
    • Add initial support for the select clause - #969
    • Support combining the errexit and pipefail options - #870
    • Set EUID just like UID - #958
    • Replace panics on unimplemented builtins with errors - #999
    • Tweak build tags to support building for js/wasm - #983
  • syntax/typedjson
    • Avoid reflect.Value.MethodByName to reduce binary sizes - #961

A special thanks to all the contributors to this release! @riacataquian @anderbubble @teefill @diamondburned

Consider becoming a sponsor if you benefit from the work that went into this release!

Binaries built on go version go1.20.5 linux/amd64 with:

CGO_ENABLED=0 go build -trimpath -ldflags="-w -s -X=main.version=v3.7.0"

v3.6.0

1 year ago

This release drops support for Go 1.17 and includes many features and fixes.

  • cmd/shfmt
    • Implement --from-json as the reverse of --to-json - #900
    • Improve the quality of the --to-json output - #900
    • Provide detected language when erroring with -ln=auto - #803
  • syntax
    • Don't require peeking two bytes after echo * - #835
    • Simplify ${name:-} to the equivalent ${name-} - #849
    • Don't print trailing whitespaces on nested subshells - #814
    • Don't print extra newlines in some case clauses - #779
    • Don't indent comments preceding case clause items - #917
    • Allow escaped newlines before unquoted words again - #873
    • Parse a redirections edge case without spaces - #879
    • Give a helpful error when <<< is used in POSIX mode - #881
    • Forbid ${!foo*} and ${!foo@} in mksh mode - #929
    • Batch allocations less aggressively in the parser
  • syntax/typedjson
    • Expose --from-json and --to-json as Go APIs - #885
  • expand
    • Improve support for expanding array keys and values - #884
    • Don't panic on unsupported syntax nodes - #841
    • Don't panic on division by zero - #892
    • Properly expand unquoted parameters with spaces - #886
    • Trim spaces when converting strings to integers - #928
  • interp
    • Add initial implementation for mapfile and readarray - #863
    • Improve matching patterns against multiple lines - #866
    • Support %b in the printf builtin - #955
    • Display all Bash options in shopt - #877
  • pattern
    • Add EntireString to match the entire string using ^$ - #866

A special thanks to all the contributors to this release! @fauust @graf0 @hristiy4n @ihar-orca @lollipopman @mkhl @przmv @reubeno @riacataquian @scop @tmillr

Binaries built on go version go1.19.4 linux/amd64 with:

CGO_ENABLED=0 go build -trimpath -ldflags="-w -s -X=main.version=v3.6.0"

Consider becoming a sponsor if you benefit from the work that went into this release!

v3.5.1

1 year ago

This release was tagged two weeks ago; we forgot to do the GitHub release with prebuilt binaries.

  • cmd/shfmt
    • Fix the Docker publishing script bug which broke 3.5.0 - #860
  • interp
    • Support multi-line strings when pattern matching in [[ - #861
    • Invalid glob words are no longer removed with nullglob - #862
  • pattern
    • Regexp now returns the typed error SyntaxError - #862

Binaries built on go version go1.18.3 linux/amd64 via a shell script.

Consider becoming a sponsor if you benefit from the work that went into this release!

v3.5.0

1 year ago

This release drops support for Go 1.16 and includes many new features.

  • cmd/shfmt
    • Switch to -ln=auto by default to detect the shell language
    • Add support for long flags, like --indent for -i
  • syntax
    • Allow extglob wildcards as function names like @() { ... }
    • Add support for heredocs surrounded by backquotes
    • Add support for backquoted inline comments
    • Add NewPos to create Pos values externally
    • Support escaped newlines with CRLF line endings
    • Minify no longer omits a leading shebang comment
    • Avoid printing escaped newlines in non-quoted words
    • Fix some printer edge cases where comments weren't properly spaced
  • fileutil
    • Add Shebang to extract the shell language from a #! line
  • expand
    • Reimplement globstar ** globbing for correctness
    • Replace os.Stat as the last direct use of the filesystem
  • interp
    • Add CallHandler to intercept all interpreted CallExpr nodes
    • Add ReadDirHandler to intercept glob expansion filesystem reads
    • Add StatHandler to intercept os.Stat and os.Lstat calls
    • Always surface exit codes from command substitutions
    • Add initial and incomplete support for set -x
    • Add support for cd - as cd "$OLDPWD"
    • Avoid panic on set - args

Binaries built on go version go1.18.2 linux/amd64 via a shell script.

Consider becoming a sponsor if you benefit from the work that went into this release!

v3.4.3

2 years ago
  • cmd/shfmt
    • New Docker v3 tag to track the latest stable version
    • Don't duplicate errors when walking directories
  • interp
    • Properly handle empty paths in the test builtin
    • Allow unsetting global vars from inside a function again
    • Use %w to wrap errors in Dir

Binaries built on go version go1.17.7 linux/amd64 via a shell script.

Consider becoming a sponsor if you benefit from the work that went into this release!

v3.4.2

2 years ago
  • syntax
    • Don't return an empty string on empty input to Quote
  • expand
    • Properly sort in ListEnviron to avoid common prefix issues
  • interp
    • export used in functions now affects the global scope
    • Support looking for scripts in $PATH in source
    • Properly slice arrays in parameter expansions

Binaries built on go version go1.17.5 linux/amd64 via a shell script.

Consider becoming a sponsor if you benefit from the work that went into this release!

v3.4.1

2 years ago
  • syntax
    • Don't return an empty string on empty input to Quote
  • expand
    • Properly sort in ListEnviron to avoid common prefix issues
  • interp
    • export used in functions now affects the global scope
    • Support looking for scripts in $PATH in source
    • Properly slice arrays in parameter expansions

Binaries built on go version go1.17.3 linux/amd64 via a shell script.

Consider becoming a sponsor if you benefit from the work that went into this release!

v3.4.0

2 years ago

This release drops support for Go 1.15, which allows the code to start benefitting from io/fs.

  • cmd/shfmt
    • Walks directories ~10% faster thanks to filepath.WalkDir
  • syntax
    • Add Quote to mirror strconv.Quote for shell syntax
    • Skip null characters when parsing, just like Bash
    • Rewrite fuzzers with Go 1.18's native fuzzing
  • fileutil
    • Add CouldBeScript2 using io/fs.DirEntry
  • expand
    • Skip or stop at null characters, just like Bash
  • interp
    • Set GID just like UID
    • Add support for read -p
    • Add support for pwd flags
    • Create random FIFOs for process substitutions more robustly
    • Avoid leaking an open file when interpreting $(<file)

Binaries built on go version go1.17.1 linux/amd64 via a shell script.

Consider becoming a sponsor if you benefit from the work that went into this release!

v3.3.1

2 years ago

Highlights:

  • syntax
    • Don't convert & in a separate line into ;
    • Fix a BinaryNextLine edge case idempotency bug
    • Never start printing a command with an escaped newline
  • interp
    • Support calling Runner.Reset before Runner.Run
    • Obey set -e for failed redirections

Binaries built on go version go1.16.6 linux/amd64 via a shell script.

Consider becoming a sponsor if you benefit from the work that went into this release!