Skip to content

Releases: mvdan/sh

v3.10.0

20 Oct 20:42
v3.10.0
392da98
Compare
Choose a tag to compare
  • cmd/shfmt
    • Report the correct language variant in parser error messages - #1102
    • Move --filename out of the parser options category - #1079
  • syntax
    • Parse all CRLF line endings as LF, including inside heredocs - #1088
    • Count skipped backslashes inside backticks in position column numbers - #1098
    • Count skipped null bytes in position column numbers for consistency
  • interp
    • Fix a regression in v3.9.0 which broke redirecting files to stdin - #1099
    • Fix a regression in v3.9.0 where HandlerContext.Stdin was never nil
    • Add an Interactive option to be used by interactive shells - #1100
    • Support closing stdin, stdout, and stderr via redirections like <&-

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

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

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

v3.9.0

16 Aug 22:25
v3.9.0
7bd422f
Compare
Choose a tag to compare

This release drops support for Go 1.21 and includes many fixes.

  • cmd/shfmt
    • Switch the diff implementation to remove one dependency
  • syntax
    • Protect against overflows in position offset integers
  • interp
    • Use os.Pipe for stdin to prevent draining by subprocesses - #1085
    • Support cancelling reads in builtins when stdin is a file - #1066
    • Support the nocaseglob bash option - #1073
    • Support the Bash 5.2 @k parameter expansion operator
    • Support the test -O and test -G operators on non-Windows - #1080
    • Support the read -s builtin flag - #1063
  • expand
    • Add support for case insensitive globbing - #1073
    • Don't panic when pattern words are nil - #1076

A special thanks to @theclapp for their contributors to this release!

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

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

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

v3.8.0

11 Feb 12:45
84baa08
Compare
Choose a tag to compare

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

18 Jun 11:38
v3.7.0
d3fa147
Compare
Choose a tag to compare

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

12 Dec 09:21
v3.6.0
Compare
Choose a tag to compare

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

07 Jun 07:56
Compare
Choose a tag to compare

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

11 May 12:49
Compare
Choose a tag to compare

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

19 Feb 20:41
Compare
Choose a tag to compare
  • 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

24 Dec 11:06
Compare
Choose a tag to compare
  • 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

23 Nov 23:02
Compare
Choose a tag to compare
  • 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!