savannah.gnu.org
coreutils-9.12 released [stable]
> This is to announce coreutils-9.12, a stable release.
>
> Notable changes include:
>
> env supports a new --env0-from=FILE option to support
> full persistence and restoration of the environment.
> This also supports e.g. filtering like:
> env -i --env0-from=<( env -0 | sed -z ... )
>
> Commands now have safer terminal output,
> avoiding confusing output or corrupted terminal state.
>
> Commands that traverse directories no longer
> fail merely if files are being removed in parallel.
>
> ptx has improved robustness, avoiding potential infinite loops.
>
> tee fixes robustness issues introduced in the previous release,
> where it could go into an infinite loop or incorrectly error
> in the presence of short writes.
>
> stty is more accepting of variations in requested speed.
>
> sort(1) will now better use available memory
> and parallel operation when reading from pipes.
>
> There have also been many bug fixes and other changes
> as summarized in the NEWS below.
>
> There have been 288 commits by 16 people in the 21 weeks since 9.11.
> Thanks to everyone who has contributed!
>
> Arun Bhattacharya (1) Leonid Evdokimov (1)
> Ayesha Shafique (1) Mateusz Nosek (1)
> Bruno Haible (5) Max Downey Twiss (1)
> Collin Funk (98) Paul Eggert (12)
> Guanqiang Han (1) Pádraig Brady (118)
> H. Peter Anvin (1) Sylvestre Ledru (33)
> Ismail Ramzi (1) aizu-m (2)
> Iván Ezequiel Rodriguez (2) oech3 (11)
>
> Pádraig [on behalf of the coreutils maintainers]
> ==================================================================
>
> Here is the GNU coreutils home page:
> https://gnu.org/s/coreutils/
>
> Here are the compressed sources:
> https://ftp.gnu.org/gnu/coreutils/coreutils-9.12.tar.gz (16MB)
> https://ftp.gnu.org/gnu/coreutils/coreutils-9.12.tar.xz (6.4MB)
>
> Here are the GPG detached signatures:
> https://ftp.gnu.org/gnu/coreutils/coreutils-9.12.tar.gz.sig
> https://ftp.gnu.org/gnu/coreutils/coreutils-9.12.tar.xz.sig
>
> Use a mirror for higher download bandwidth:
> https://www.gnu.org/order/ftp.html
>
> Here are the SHA256 and SHA3-256 checksums:
>
> SHA256 (coreutils-9.12.tar.gz) = FMv1pN4Me3+jufp/raTFiy3v4zM2qo/YPXYixcTr3BM=
> SHA3-256 (coreutils-9.12.tar.gz) = 14aJyepDW60jsaL4cq5T/UFMwUJEkXDyUqZEQlsnLFM=
> SHA256 (coreutils-9.12.tar.xz) = pIAZhVlzPps9qZnpBUOsb4iKLKpUTY1mTFofF+Uo4hA=
> SHA3-256 (coreutils-9.12.tar.xz) = cKcyD1sxJr1tdWgWbh0+OKwOEIpaf2ACThlaHZooZDA=
>
> Verify the base64 SHA256 checksum with 'cksum -a sha256 --check'
> from coreutils-9.2 or OpenBSD's cksum since 2007.
>
> Verify the base64 SHA3-256 checksum with 'cksum -a sha3 --check'
> from coreutils-9.8.
>
> Use a .sig file to verify that the corresponding file (without the
> .sig suffix) is intact. First, be sure to download both the .sig file
> and the corresponding tarball. Then, run a command like this:
>
> gpg --verify coreutils-9.12.tar.gz.sig coreutils-9.12.tar.gz
>
> The signature should match the fingerprint of the following key:
>
> pub rsa4096/0xDF6FD971306037D9 2011-09-23 [SC]
> Key fingerprint = 6C37 DC12 121A 5006 BC1D B804 DF6F D971 3060 37D9
> uid [ultimate] Pádraig Brady <P@draigBrady.com>
> uid [ultimate] Pádraig Brady <pixelbeat@gnu.org>
>
> If that command fails because you don't have the required public key,
> or that public key has expired, try the following commands to retrieve
> or refresh it, and then rerun the 'gpg --verify' command.
>
> gpg --locate-external-key P@draigBrady.com
>
> gpg --recv-keys DF6FD971306037D9
>
> wget -q -O- 'https://savannah.gnu.org/project/release-gpgkeys.php?group=coreutils&download=1' | gpg --import -
>
> As a last resort to find the key, you can try the official GNU
> keyring:
>
> wget -q https://ftp.gnu.org/gnu/gnu-keyring.gpg
> gpg --keyring gnu-keyring.gpg --verify coreutils-9.12.tar.gz.sig coreutils-9.12.tar.gz
>
> This release is based on the coreutils git repository, available as
>
> git clone https://https.git.savannah.gnu.org/git/coreutils.git
>
> with commit c0f8514d989184921d9b12a4d103a7b23abc5af8 tagged as v9.12.
>
> For a summary of changes and contributors, see:
>
> https://gitweb.git.savannah.gnu.org/gitweb/?p=coreutils.git;a=shortlog;h=v9.12
>
> or run this command from a git-cloned coreutils directory:
>
> git shortlog v9.11..v9.12
>
> This release was bootstrapped with the following tools:
> Autoconf 2.73.16-0a513
> Automake 1.18.1
> Gnulib 2026-09-07 106e9b2384d08a1696fcbd40cbab52237943f208
> Bison 3.8.2
>
> NEWS
>
> * Noteworthy changes in release 9.12 (2026-09-14) [stable]
>
> ** Bug fixes
>
> 'chcon', 'chgrp', 'chmod', 'chown', 'du', 'ls' which traverse hierarchies with
> -R, no longer fail merely because files may be being removed in parallel.
> [This bug was present in "the beginning".]
>
> 'comm - -' no longer closes standard input twice. Previously it would
> mistakenly exit with a nonzero status.
> [This bug was present in "the beginning".]
>
> 'cp', 'install', and 'mv' now fall back to a standard copy
> if a --reflink=auto clone fails due to EDQUOT, ENOMEM, or ENOSPC.
> E.g., with XFS, a clone can exhaust metadata space in an allocation
> group, while a standard copy works.
> [bug introduced in coreutils-9.2]
>
> 'cut -d' with multiple multi-byte delimiter options specified
> will correctly match the last delimiter specified.
> [bug introduced with multi-byte support in coreutils-9.11]
>
> 'date -d '1-2-3' "+%_D"' no longer propagates flags like _ and - to the year
> component of the %D date specifier, keeping consistent component formatting.
> [bug introduced in coreutils-8.31]
>
> 'du --max-depth=N' now exits with a nonzero exit status and an error message
> if N is negative. Previously it behaved as if N were zero.
> [bug introduced in coreutils-9.4]
>
> 'factor' avoids a buffer over-read (CWE-126) for certain values.
> [bug introduced in coreutils-9.8]
>
> 'head' and 'tail' now quote names in file headers when needed.
> [This bug was present in "the beginning".]
>
> 'ls --color' no longer reads freed memory when LS_COLORS sets "ln=target"
> and later becomes unparsable, e.g., LS_COLORS='ln=target:x'.
> [This bug was present in "the beginning".]
>
> 'mv' now warns when copying extended attributes fails with ENOTSUP, e.g., when
> moving files to a file system that does not support them.
> [bug introduced in coreutils-7.3]
>
> 'numfmt', 'printf', and 'seq' on Solaris, no longer output an extraneous e+00
> when using a large precision like "%.5119f".
> [This bug was present in "the beginning".]
>
> 'pinky -l' no longer no longer prints output in the incorrect order when
> standard output is fully buffered, e.g., when redirected to a file.
> [bug introduced in coreutils-9.10]
>
> 'pr' now exits gracefully upon exceeding internal accounting limits,
> like when processing large tab stops.
> [This bug was present in "the beginning".]
>
> 'ptx -G' no longer loops forever when the output width is smaller than
> twice the gap size, as with 'ptx -G -w4', or when a long reference
> leaves that little room, as with 'ptx -G -r'.
> [This bug was present in "the beginning".]
>
> 'ptx -W' no longer loops forever with a word regular expression that can
> match the empty string, like: echo ab | ptx -W 'a*'.
> [This bug was present in "the beginning".]
>
> 'shred' no longer blocks when opening a FIFO that has no readers.
> [This bug was present in "the beginning".]
>
> 'stty' no longer fails when the system uses speed encodings that
> are variations of the requested speed.
> [bug introduced in coreutils-9.8]
>
> 'tee' no longer loops infinitely after writing all output if a write call sets
> errno to EAGAIN.
> [bug introduced in coreutils-9.11]
>
> 'tee' no longer treats short writes as errors.
> [bug introduced in coreutils-9.11]
>
> 'test' no longer treats '-a' and '-o' as operators when given as strings to a
> binary operator. E.g., 'test -a -a -a' exits successfully instead of exiting
> with an error.
> [This bug was present in "the beginning".]
>
> 'truncate --reference=R' no longer hangs when R is a FIFO with no readers.
> [bug introduced in coreutils-8.17]
>
> 'unexpand -t' no longer overflows a heap buffer, for tab values > SIZE_MAX/16,
> or with multi-byte blank characters longer than the tab value.
> [bugs introduced in coreutils-9.11]
>
> 'uniq -w' no longer overruns the read buffer in multibyte locales.
> [bug introduced in coreutils-9.5]
>
> 'wc' no longer reads past the end of a lookup table in legacy multibyte
> locales like SHIFT-JIS where a single byte can decode to a wide character.
> [bug introduced in coreutils-9.5]
>
> Messages from Gnulib are no longer mistranslated in non-English locales.
> [bug introduced in coreutils-9.6]
>
> ** New Features
>
> 'env' now supports --env0-from=FILE to read NUL-delimited environment entries
> from a file. With -i, entries are preserved exactly, allowing full
> round-tripping of environments containing duplicate or nonstandard entries.
>
> 'stat' and 'tail' now know about the "failfs" and "nullfs" file system types.
> stat -f -c%T now reports the file system type,
> and tail -f uses inotify for these file systems.
>
> uname adds the -A,--all-labeled option to label all output, one item per line.
>
> ** Changes in behavior
>
> 'env' and 'printenv' now quote printed environment variables honoring the
> QUOTING_STYLE environment variable, defaulting to shell-escape style. This
> avoids printing arbitrary data to the terminal and allows the output to be
> sourced by a POSIX shell.
>
> 'ls' -w,--width no longer includes '\n' in the width of a line.
> I.e., the width or $COLUMNS is interpreted to be an _inclusive_ maximum.
>
> 'stat' now uses shell quoting when required, to more robustly escape
> file names. Previously it only quoted file names with the %N format.
> The default quoting honors the QUOTING_STYLE env variable (like %N).
> Also %Qn is a newly supported format combination to quote file names,
> leaving the existing %n format for when quoting is not desired.
>
> ** Improvements
>
> When built with the configure option '--with-wtmpdb', invocations of
> 'who /var/log/wtmp' and 'users /var/log/wtmp' use the wtmpdb database
> instead of the file /var/log/wtmp. This makes them Y2038-safe.
>
> 'cut -w' operates more efficiently when extracting the start of a line
> in multi-byte locales, giving 4x more throughput with typical input.
>
> 'df', 'du', 'ls', 'od', 'pr', and 'sort' now escape invalid arguments in error
> messages for options expecting an integer.
>
> 'env -0, and 'printenv -0' now explicitly set binary mode on output
> so that no CRLF translation is done e.g., on windows.
>
> 'install -C' will now avoid updating file metadata when the destination
> already has the appropriate ownership and permissions.
>
> 'basename', 'dirname', 'du', 'readlink', and 'realpath' now quote output in
> shell-escape style when standard output is a terminal. The QUOTING_STYLE
> environment variable can be used to adjust or disable the quoting.
>
> 'ls -m' now quotes files names containing commas when appropriate,
> so users can better distinguish separating commas.
>
> 'ls' now replaces newlines in file names if ambiguous with separators.
> Previously newlines were protected only when outputting to a terminal.
>
> 'sort' will now better use available memory and parallel operation
> when reading from unknown sized inputs like pipes.
>
> 'uniq -c' now operates up to 2.5x times faster on systems with unlocked stdio
> functions.
>
>
> ** Build-related
>
> 'logname' now builds, where getlogin() is replaced (e.g. with musl),
> and systemd libs are being used, by linking the required libraries.
>
> The multi-call binary built with configure --enable-single-binary is reduced
> in size by around 10KB through the more efficient reuse of the 'test' code
> by '[', and the 'true' code by 'false'.
>
> configure no longer accepts the --with-linux-crypto option, which allowed
> cksum, md5sum, and sha*sum to use the Linux AF_ALG API. This API will be
> deprecated in Linux 7.2 and is less performant than OpenSSL.
>
> The configure option '--enable-systemd' is renamed to '--with-systemd'.
> The option '--enable-systemd' was a misnomer and is now deprecated.
>
> The 'sort' binary now uses the UAPI Group's .note.dlopen ELF note
> to indicate its dependency on libcrypto.
>