sh v3.13.1 Release Notes

Release Date: 2026-04-06 // 5 months ago
    • cmd/shfmt

      • Add support for [[zsh]] in EditorConfig files
      • Detect the shell variant from filenames like .zshrc and .bash_profile
      • Fix --apply-ignore when used with explicit args - #1310
    • syntax

      • Revert an accidental change to how array subscripts are formatted - #1314
      • Never join ;; with the previous line when formatting - #1289
      • Fix a bug where $1[foo] was parsed as a subscript in Zsh - #1288
      • Correctly parse $! in double quotes in Zsh - #1298
      • Allow indexing into special parameters in Zsh - #1299
      • Allow parameter expansions with empty names in Zsh - #1280
    • interp

      • Test against Bash 5.3 and fix three new discrepancies
      • Fix a few bugs related to nameref variables
      • Avoid panics when user input encounters unimplemented features

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

    ๐Ÿง Binaries built on go version go1.26.1 linux/amd64 with:

    CGO_ENABLED=0 go build -trimpath -ldflags="-w -s"
    

Previous changes from v3.13.0

  • ๐Ÿš€ This release introduces support for Zsh in the parser and formatter, which was tracked in issue #120 alongside the label zsh . While support is not complete, it should be far enough for many use cases.

    ๐Ÿš€ This release also drops support for Go 1.24 and includes many other enhancements:

    • cmd/shfmt

      • Exit with a non-zero status when -l prints any filenames
      • shfmt -version is now derived from the git current tag, dropping the -ldflags workaround
    • syntax

      • New nodes types and node fields are introduced alongside LangZsh
      • LangVariant is now a bitset, allowing the use of sets like "Bash-like"
      • Add InteractiveSeq and StmtsSeq iterator methods for Parser
      • Stop exposing the internal buffer in Printer via struct embedding
      • Support the use of brace expansions like declare {a,b}_c=value
      • Fix a bug where POSIX and Bash incorrectly allowed empty command lists
    • interp

      • Add support for shopt -s dotglob and shopt -s extglob
      • Add support for simple uses of !(expr) extended glob patterns
      • Support more builtin flags for declare, type, read
      • Fix various bugs relating to nulls, errors, and arrays
    • expand

      • Add Config.DotGlob and Config.ExtGlob for the interpreter
      • Add Variable.Flags to get the one-character declare flags
      • Do not force env vars on Windows to be uppercase
      • Fix various bugs relating to glob pattern matching
    • pattern

      • Add GlobLeadingDot and ExtendedOperators for the interpreter
      • Add NegExtGlobError to mark the use of !(expr) negation patterns

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

    ๐Ÿง Binaries built on go version go1.26.1 linux/amd64 with:

    CGO_ENABLED=0 go build -trimpath -ldflags="-w -s"
    

    ๐Ÿš€ Note that this release no longer includes a sha256sums.txt asset; GitHub now provide digests natively.