This release drops support for Go 1.25 and includes many enhancements, particularly in the interpreter, which implements more shell features and fixes many divergences from Bash.
- cmd/shfmt
- Add
--detectto find shell files by executable bit or shebang - #944
- Add
- syntax
- Add
Preorder, an iterator over all nodes, complementingWalk - Add
encoding.TextUnmarshalerimplementations for each operator type - Support
${ foo;}and${|foo;}inside double quotes - #1368 - Support array elements in
{varname}redirects, likeexec {fds[3]}>&-- #719 - Backslashes inside backquotes within double quotes escape double quotes - #1083
- Allow pound signs in associative array keys like
${args[cmd,#]}- #1285 - Don't treat
#as the start of a comment inside[[ ]]tests - #1326 - Don't join
thenordowith a semicolon when heredocs are pending - #1047 - Print a space after
!in arithmetic expressions, avoiding history expansion - #987 - Space nested closing parentheses like the opening ones - #876
- Make
SplitBracesreject malformed sequences and skip backslash escapes - #1330 - Zsh: support the
${=name},${~name}, and${^name}prefixes - #1238 - Zsh: support the
;|case terminator and leading parentheses for globs - #1293, #1279 - Zsh: parse subscript flag arguments as patterns, and allow
[globs in arrays - #1278, #1322
- Add
- syntax/typedjson
- Encode operators as their syntax form, such as
">>", rather than integers - #1321 - Return errors rather than panicking on malformed input
- Encode operators as their syntax form, such as
- interp
- Add
BashOptsto set Bash options likeshopt- #962 - Add
AccessHandlerto control file access checks, used by-randcd- #1318 - Add
HandlerContext.LastExitStatus, and provide aHandlerContextto stat handlers - Implement the
helpandtimesbuiltins, as well as$-- #1398 - Implement the
;∧;&case terminators - #1391 - Implement the
-Ntest operator, and make-ntand-otfollow POSIX - #1340 - Support sparse indexed arrays such as
a=([5]=x)- #1373 - Run files as shell scripts when
execfails withENOEXEC- #1065 - Support empty here-documents, and don't expand quoted ones - #1390
- Support
js/wasm, where subprocesses and pipes are unavailable - Keep the redirections applied by
execwith no arguments - Only fire the exit trap when the shell exits, rather than after every
Run
- Add
- expand
- Add
BracesSeqwith a config and error reporting, deprecatingBraces - Add
Variable.Indexesto describe sparse indexed arrays - Support integer bases in arithmetic - #339
- Short-circuit the arithmetic
&&and||operators - #1371 - Apply per-element operators to quoted array expansions like
"${a[@]%o}"- #1081 - Make unquoted
${!arr[@]}consistent with the quoted form - #672 - Fix many divergences from Bash in arithmetic, string, and brace expansions
- Reject unsupported Zsh syntax rather than panicking - #1363
- Add
- pattern
- Treat an unmatched
[as a literal character, like Bash - #1372 - Fix panics and mismatches in bracket expressions, such as
[![:space:]]
- Treat an unmatched
- fileutil
- Recognize
dashshebangs as POSIX shell for-ln=auto- #1307
- Recognize
Consider becoming a sponsor if you benefit from the work that went into this release!
Binaries built on go version go1.27.0 linux/amd64 with:
CGO_ENABLED=0 go build -trimpath -ldflags="-w -s"