All notable changes to the shell are documented in this file.
This file lists changes to the shell executable as a whole. Changes to the implementing library crate are not documented since it is not intended to be used by other programs.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
3.0.7 - 2026-04-30
- Internal fixes only. No user-visible changes.
3.0.5 - 2026-02-04
- The
killbuilt-in no longer filters out invalid signals when they are specified by number. Instead, it now attempts to send the specified signal number as is, and lets the operating system handle invalid signal numbers. This change allows sending custom signals that are not recognized by the shell, if the operating system supports them.
- The
killbuilt-in now correctly formats error messages for invalid options and signal specifications.
3.0.4 - 2025-11-07
- Revised some error messages related to executing external utilities.
3.0.3 - 2025-10-18
- The
timesbuilt-in now uses thegetrusagesystem call instead oftimesto get CPU times. This provides better resolution on many systems.
3.0.2 - 2025-10-16
- The shell no longer crashes when the
xtraceoption is enabled and thePS4variable contains a command substitution, which previously caused infinitely recursive expansion ofPS4.
3.0.1 - 2025-10-13
- Slightly refined the format of error messages.
3.0.0 - 2025-09-23
This is the first stable release of yash-rs.
- The
pipefailshell option is now supported.- When this option is enabled, the exit status of a pipeline reflects the failure of any command in the pipeline, not just the last command.
- The special parameter
!is now considered unset if no asynchronous command has been executed. - The shell now displays a more informative error message when the
functionor[[reserved word is used, indicating that these syntaxes are not yet supported. - The shell now displays a more informative error message when process
redirections (
>(...)or<(...)), pipe redirections (>>|), or here-strings (<<<) are used, indicating that these redirections are not yet supported.
0.4.5 - 2025-09-20
- The
returnbuilt-in now supports the--no-returnoption as a synonym of-n, which returns the specified exit status without actually returning from the current function or script.
- The
eval,exit,return,shift, andtypesetbuilt-ins now correctly handle the--separator between options and operands. - The
export,readonly, andtypesetbuilt-ins now correctly print the--separator when the name of a variable or function starts with-. - The
jobsbuilt-in no longer crashes when reporting the same finished job more than once in a single invocation.
0.4.4 - 2025-09-20
- The execution of a simple command now searches for the external utility in the
PATHafter performing variable assignments, as specified in POSIX-1.2024. Previously, it would search for the utility before performing the redirections and assignments, which could lead to incorrect behavior if the assignments modified thePATHvariable.
0.4.3 - 2025-09-14
Update: This version was accidentally published without updating the necessary dependencies for the advertised behavior. Please use version 0.4.5 or later.
Thereturnbuilt-in now supports the--no-returnoption as a synonym of-n, which returns the specified exit status without actually returning from the current function or script.
- Error messages now accurately highlight the relevant source code fragment. Previously, the shell could highlight the wrong section or crash when the source contained multi-byte characters.
Theeval,exit,return,shift, andtypesetbuilt-ins now correctly handle the--separator between options and operands.Theexport,readonly, andtypesetbuilt-ins now correctly print the--separator when the name of a variable or function starts with-.Thejobsbuilt-in no longer crashes when reporting the same finished job more than once in a single invocation.
0.4.2 - 2025-05-11
- The shell now recognizes the I/O location notation attached to a redirection
operator as in
{n}<file. Currently, the shell does not support this notation, but it is reserved for future use.
- When a tilde expansion produces a directory name that ends with a slash and the expansion is followed by a slash, the trailing slash in the directory name is now removed to maintain the correct number of slashes.
- The
cdbuilt-in now returns exit status 1 if updating$PWDor$OLDPWDfails because the variable is read-only. Previously, it returned status 0, which did not conform to POSIX.1-2024 XBD 8.1.
0.4.1 - 2025-05-03
- The shell now correctly handles traps for signals that are caught while reading a command. Previously, the shell would ignore such signals.
- The
getoptsandreadbuilt-ins now fail when a specified variable name contains an=character. - The
setbuilt-in without arguments no longer prints variables that have an invalid name. - When a field is made up of a single tilde expansion that expands to an empty string, the expanded field is no longer removed from the command line, as required by POSIX.1-2024.
0.4.0 - 2025-04-26
- In pathname expansion, pathname component patterns no longer expand to the
filename
.or... For example, the pattern.*may match.configand.git, but not.or... - When a value is assigned to a variable in an expansion of the form
${name=word}or${name:=word}, the resulting expansion is now the value of the variable after the assignment, rather than the expansion ofword. This is the behavior specified in POSIX.1-2024. - The
true,false, andpwdbuilt-ins are now substitutive, as specified in POSIX.1-2024. - The
execbuilt-in now accepts the--separator between options and operands, as required by POSIX.1-2024. - When an asynchronous command is executed in an interactive shell, the job number and the process ID are now printed to the standard error, as required by POSIX.1-2024.
- The shell now returns an exit status of 128 on an I/O error reading command
input, except when reading a script in the
.built-in, as required by POSIX.1-2024. - When a command is terminated by a signal and its exit status is used as the exit status of the shell, the shell now terminates itself with the same signal, as required by POSIX.1-2024.
- As specified in POSIX.1-2024, the shell now becomes interactive if the
+ioption is not set, the-soption is set, and the standard input and error are connected to a terminal, regardless of positional parameters. Previously, the shell would become interactive only if there were no positional parameters.
0.3.0 - 2025-03-23
- The shell now supports declaration utilities as defined in POSIX.
- The
cdbuilt-in now supports the-eoption as defined in POSIX. - The
readbuilt-in now supports the-d(--delimiter) option, which allows specifying a delimiter character to terminate the input. - The
trapbuilt-in now implements the POSIX.1-2024 behavior of showing signal dispositions that are not explicitly set by the user. It also supports the-p(--print) option. - The
-poption for thecommandbuilt-in now works on Linux.
- When a foreground job is suspended in an interactive shell, the shell now discards any remaining commands in the current command line and prompts for the next command line. This behavior basically conforms to POSIX.1-2024, but differs in that the shell does not resume with the remaining commands following the next asynchronous and-or list.
- When the shell starts job control, if it is in the background, the shell now suspends itself until it is resumed in the foreground. Previously, the shell would continue running in the background, interfering with the foreground process group.
- If job control is enabled and the shell does not have a controlling terminal, the shell now proceeds without managing foreground-ness of process groups. Jobs are still assigned to their own process groups. Previously, the shell would abort command execution in this case.
- The
cdbuilt-in now errors out when a given operand is an empty string. - The
cdbuilt-in now returns different exit statuses for different errors. - The
fgandbgbuilt-ins now error out if job control is not enabled. - The command
kill -lnow shows signals in the ascending order of their numbers. - The
readbuilt-in now returns a more specific exit status depending on the cause of the error. It also rejects an input containing a null byte. - The output of the
trapbuilt-in now includes not only user-defined traps but also signal dispositions that are not explicitly set by the user. - The
waitbuilt-in no longer treats suspended jobs as terminated jobs. When waiting for a suspended job, the built-in now waits indefinitely until the job is resumed and finished.
0.2.0 - 2024-12-14
- A case branch now can be terminated with
;∨|instead of;;to fall through to the next branch or to resume pattern matching from the next branch, respectively.;&is a POSIX.1-2024 feature, and;|is an extension. For compatibility with other shells,;;&is also accepted as an alias for;|. - Dollar-single-quotes are now supported as a form of quoting where backslash
escapes are recognized.
- Currently, octal and hexadecimal escapes that expand to a value greater than 127 are translated to a UTF-8 sequence for the corresponding Unicode scalar value. This behavior does not conform to POSIX.1-2024 and is subject to change.
- As an extension to POSIX.1-2024, the shell also recognizes the
\uand\Uescapes for Unicode scalar values, and the\Eescape as a synonym for\e.
- The shell's syntax now allows
esacas the first pattern of a case branch as incase esac in (esac|case) echo ok; esac. Previously, it was a syntax error, but POSIX.1-2024 allows it. - The
bgbuilt-in now updates the!special parameter to the process ID of the background job, as required by POSIX.1-2024. - The
execbuilt-in no longer exits the shell when the specified command is not found in an interactive shell, as required by POSIX.1-2024.
- The interactive shell now discards the entire line when a syntax error occurs in the middle of a command line. Previously, it would continue parsing the rest of the line, which could lead to confusing behavior.
0.1.0 - 2024-09-29
- The shell now runs the initialization file specified by the
ENVenvironment variable if it is set and the shell is interactive.
- The shell now rejects an invalid parameter as a syntax error. Specifically,
if a parameter starts with a digit but is not a valid number, the shell now
reports a syntax error instead of treating it as a variable. For example,
${1abc}and${0_1}are now syntax errors. - Improved error messages for some parameter expansion errors.
- Interactive shells now report updates to job status before showing the prompt.
- Interactive shells no longer exit on shell errors such as syntax errors.
- Interactive shells now ignore the
noexecoption. - Interactive shells now support the
ignoreeofoption. - Interactive shells now allow modifying the trap for signals that were ignored on the shell startup.
- When the shell cannot open a script specified by the command-line argument, it now returns the exit status of 126 or 127 as required by POSIX. Previously, it returned the exit status of 2.
0.1.0-beta.2 - 2024-07-13
- The shell now shows the prompt before reading the input in the interactive mode.
- The break and continue built-ins no longer allow exiting a trap.
- The read built-in now shows a prompt when reading a continued line.
- The source built-in now echoes the input when the verbose shell option is set.
- The set built-in no longer sets the
SIGTTIN,SIGTTOU, andSIGTSTPsignals to be ignored when invoked with the-moption in a subshell of an interactive shell.
0.1.0-beta.1 - 2024-06-09
- The shell now enables blocking reads on the standard input if it is a terminal or a pipe as required by POSIX.
0.1.0-alpha.1 - 2024-04-13
- Initial release of the shell