mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-13 19:52:20 +00:00
Noteworthy changes: - The man pages have been updated to fix a ton of instances of runaway underlining (this was done with `sed -i 's/\\f5/\\f3/g'` commands). This commit dramatically increased in size because of this change. - The documentation for spawnveg(3) has been extended with information about its usage of posix_spawn(3) and vfork(2). - The documentation for tmfmt(3) has been updated with the changes previously made to the man pages for the printf and date builtins (though the latter builtin is disabled by default). - The shell's tracked alias tree (hash table) is now documented in the shell(3) man page. - Removed the commented out regression test for an ERRNO variable as the COMPATIBILITY file states it was removed in ksh93.
1292 lines
53 KiB
Text
1292 lines
53 KiB
Text
This documents significant changes in the 93u+m branch of AT&T ksh93.
|
|
For full details, see the git log at: https://github.com/ksh93/ksh
|
|
|
|
Any uppercase BUG_* names are modernish shell bug IDs.
|
|
|
|
2021-04-22:
|
|
|
|
- shcomp (the shell bytecode compiler) was fixed to correctly compile process
|
|
substitutions used as the file name to a redirection, as in 'cmd < <(cmd)'.
|
|
|
|
- Fixed a bug introduced on 2020-07-13 that set LINENO to the wrong line
|
|
number after leaving a virtual subshell in which LINENO had been unset.
|
|
|
|
2021-04-21:
|
|
|
|
- Fixed a bug introduced on 2020-09-28 that caused an interactive ksh to exit
|
|
if a profile script (such as ~/.kshrc) contains a syntax error.
|
|
|
|
2021-04-20:
|
|
|
|
- Fixed three problems with the /opt/ast/bin/getconf built-in command:
|
|
1. The -l/--lowercase option did not change all variable names to lower case.
|
|
2. The -q/--quote option now quotes all string values. Previously, it only
|
|
quoted string values that had a space or other non-shellsafe character.
|
|
3. The -c/--call, -n/--name and -s/--standard options matched all variable
|
|
names provided by 'getconf -a', even if none were actual matches.
|
|
|
|
- The readonly attribute of ksh variables is no longer imported from
|
|
or exported to other ksh shell instances through the environment.
|
|
|
|
2021-04-16:
|
|
|
|
- Fixed a bug in emacs mode: after using tab completion to complete the name
|
|
of a directory, it was not possible to type numbers after the slash.
|
|
|
|
- Fixed an optimization bug that caused the <>; redirection operator to fail
|
|
when used with the last command in a -c script.
|
|
|
|
2021-04-14:
|
|
|
|
- Path-bound built-ins (such as /opt/ast/bin/cat) can now be executed by
|
|
invoking the canonical path, so the following will now work as expected:
|
|
$ /opt/ast/bin/cat --version
|
|
version cat (AT&T Research) 2012-05-31
|
|
$ (PATH=/opt/ast/bin:$PATH; "$(whence -p cat)" --version)
|
|
version cat (AT&T Research) 2012-05-31
|
|
Non-canonical paths such as /opt/ast/./bin/cat will not find the built-ins.
|
|
|
|
- Path-bound built-ins will now also be found on a PATH set locally using an
|
|
assignment preceding the command, so the following will now work as expected:
|
|
$ PATH=/opt/ast/bin cat --version
|
|
version cat (AT&T Research) 2012-05-31
|
|
|
|
2021-04-13:
|
|
|
|
- Fixed a few bugs that could cause ksh to show the wrong error message and/or
|
|
return the wrong exit status if a command couldn't be executed. In
|
|
scenarios where the command was found in the PATH but it was not executable,
|
|
ksh now returns with exit status 126. Otherwise, ksh will return with exit
|
|
status 127 (such as if the command isn't found or if the command name is
|
|
too long).
|
|
|
|
2021-04-12:
|
|
|
|
- Corrected a memory fault when an attempt was made to unset the default
|
|
nameref KSH_VERSION from the shell environment prior to any other name
|
|
reference variable creation or modification.
|
|
|
|
2021-04-11:
|
|
|
|
- Fixed two related regressions introduced on 2020-06-16:
|
|
1. The += assignment failed to append the value of variables when used
|
|
in an invocation-local scope. The following should print '5', but
|
|
the regression resulted in '3' being printed instead:
|
|
$ integer foo=2; foo+=3 command eval 'echo $foo'
|
|
3
|
|
2. Any += assignment used in an invocation-local scope could modify
|
|
readonly variables.
|
|
|
|
2021-04-10:
|
|
|
|
- Fixed: the internal count of the recursion level for arithmetic expressions
|
|
was not reset when certain errors occurred in a virtual subshell. This could
|
|
cause an erroneous "recursion to deep" error when a loop executed many
|
|
subshells containing arithmetic expressions with errors, e.g. for testing.
|
|
|
|
2021-04-09:
|
|
|
|
- Fixed a bug that caused ksh to enable -c during the shell's initialization
|
|
if the only argument passed was --posix.
|
|
|
|
- Fixed a related bug that caused 'set --posix' to leave the braceexpand and
|
|
letoctal shell options unchanged.
|
|
|
|
- Fixed a bug that caused 'set --default' to unset the restricted option
|
|
in restricted shells.
|
|
|
|
2021-04-08:
|
|
|
|
- Path-bound builtins will now be used by restricted shells if /opt/ast/bin
|
|
is in the $PATH upon invoking the shell or before setting it to restricted.
|
|
|
|
- Fixed a bug that caused "printf '%T\n' now" to ignore $LC_ALL and $LC_TIME
|
|
if the current locale was previously set, unset then set again.
|
|
|
|
2021-04-07:
|
|
|
|
- The $LC_TIME variable is now recognized by ksh and if set to an invalid
|
|
locale will show an error.
|
|
|
|
- Fixed BUG_CSUBSTDO: If standard output is closed before running a command
|
|
substitution, redirecting any other file descriptor no longer closes standard
|
|
output inside of the command substitution.
|
|
|
|
2021-04-05:
|
|
|
|
- Fixed a regression, introduced in ksh 93t+ 2009-07-31, that caused a command
|
|
like 'unset arr[3]' to unset not just element 3 of the array but all elements
|
|
starting from 3, if a range expansion like ${arr[5..10]} was previously used.
|
|
|
|
- Several fixes for arrays of a type created by 'enum' were backported from ksh
|
|
93v-, further to the two enum array fixes already applied on 2021-02-01:
|
|
1. The array[@]} expansion was fixed for associative arrays of an enum type.
|
|
2. Assignments now work correctly for all enum values for both indexed and
|
|
associative arrays.
|
|
3. 'unset' will now completely unset an associative array of an enum type.
|
|
|
|
2021-04-04:
|
|
|
|
- A bug was fixed that caused a broken prompt display upon redrawing the
|
|
command line if the last line of the prompt includes an xterm escape
|
|
sequence that is terminated by $'\a' (the bell character).
|
|
|
|
- Harden readonly variables. Readonly variables or arrays no longer allow
|
|
attribute changes which would otherwise allow their value to be altered.
|
|
Expanded support for readonly variables within multidimensional arrays.
|
|
|
|
2021-04-03:
|
|
|
|
- Fixed a bug that caused the uname builtin's -d option to change the output
|
|
of the -o option.
|
|
|
|
- Fixed a possible crash that could occur when showing the domain name
|
|
with the uname builtin's -d option.
|
|
|
|
2021-03-31:
|
|
|
|
- Fixed a bug that caused 'cd -' to ignore the current value of $OLDPWD
|
|
when it's set to a different directory in a new scope.
|
|
|
|
- Fixed a related bug that caused ksh to use the wrong value for $PWD
|
|
when in a new scope.
|
|
|
|
2021-03-29:
|
|
|
|
- Fixed an intermittent crash that could occur in vi mode when using the 'b'
|
|
or 'B' commands to go back one word.
|
|
|
|
2021-03-27:
|
|
|
|
- The 'test' builtin will now show an error message when given the invalid ']]'
|
|
or '=~' operators; it also properly returns with exit status 2 now (instead
|
|
of exit status 1). If the invalid operator is supported by [[ ... ]] (such
|
|
as '=~'), test will now suggest the usage of [[ ... ]] instead.
|
|
|
|
2021-03-22:
|
|
|
|
- A new --globcasedetect shell option is added to ksh on OSs where we can check
|
|
for a case-insensitive file system (currently macOS, Windows/Cygwin, Linux
|
|
and QNX 7.0+). When this option is turned on, file name generation
|
|
(globbing), as well as file name tab completion on interactive shells,
|
|
automatically become case-insensitive on file systems where the difference
|
|
between upper- and lowercase is ignored for file names. This is transparently
|
|
determined for each directory, so a path pattern that spans multiple file
|
|
systems can be part case-sensitive and part case-insensitive.
|
|
The option is not compiled into ksh on systems where we do not know of a
|
|
method to check for file system case insensitivity. The shell option can be
|
|
force-compiled by setting SHOPT_GLOBCASEDET to 1 in src/cmd/ksh93/SHOPT.sh,
|
|
but it won't have any effect on non-supported systems, so this is not
|
|
recommended. It can be removed from ksh by setting SHOPT_GLOBCASEDET to 0.
|
|
|
|
2021-03-17:
|
|
|
|
- Fixed a bug with file name completion on the interactive shell in multibyte
|
|
locales. Upon encountering two filenames with multibyte characters starting
|
|
with the same byte, a partial multibyte character was autocompleted.
|
|
|
|
2021-03-16:
|
|
|
|
- Tilde expansion can now be extended or modified by defining a .sh.tilde.get
|
|
or .sh.tilde.set discipline function. This replaces a 2004 undocumented
|
|
attempt to add this functionality via a .sh.tilde built-in, which never
|
|
worked and crashed the shell. See the manual for details on the new method.
|
|
|
|
- Fixed a bug in interactive shells: if a variable used by the shell called
|
|
a discipline function (such as PS1.get() or COLUMNS.set()), the value of $?
|
|
was set to the exit status of the discipline function instead of the last
|
|
command run.
|
|
|
|
2021-03-15:
|
|
|
|
- If the HOME variable is unset, the bare tilde ~ now expands to the current
|
|
user's system-configured home directory instead of merely the username.
|
|
|
|
- Tighten up potential invalid typeset attribute combos when more than
|
|
one numeric type has been requested. In particular, -F and -i are no
|
|
longer masked over by previously given float types.
|
|
|
|
2021-03-13:
|
|
|
|
- Fixed a file descriptor leak that occurred when ksh used /dev/fd for
|
|
process substitutions passed to functions.
|
|
|
|
- Fixed a separate file descriptor leak that happened when a process
|
|
substitution was passed to a nonexistent command.
|
|
|
|
2021-03-11:
|
|
|
|
- Fixed an intermittent bug that caused process substitutions to infinitely
|
|
loop in Linux virtual machines that use systemd.
|
|
|
|
- Fixed a bug that caused process substitutions to leave lingering processes
|
|
if the command invoking them never reads from them.
|
|
|
|
2021-03-09:
|
|
|
|
- The ${!foo@} and ${!foo*} expansions yield variable names beginning with foo,
|
|
but excluded 'foo' itself. The fix for this is now backported from 93v- beta.
|
|
|
|
- test -v var, [ -v var ], and [[ -v var ]] did not correctly test if a
|
|
variable is set or unset after it has been given a numeric attribute with
|
|
'typeset' but not yet assigned a value. This has been fixed so that
|
|
[[ -v var ]] is now equivalent to [[ -n ${var+set} ]] as documented.
|
|
|
|
2021-03-07:
|
|
|
|
- Fixed the typeset -p display of short integers without an assigned value.
|
|
Also, the last -s or -l attribute option supplied for an integer is used.
|
|
|
|
- Fixed a bug with -G/--globstar introduced on 2020-08-09: patterns did not
|
|
match anything if any pathname component was '.' or '..', e.g. '**/./glob.c'
|
|
never matched. The 2020-08-09 fix does still apply to patterns like '.*'.
|
|
|
|
- Enhancement to -G/--globstar: symbolic links to directories are now followed
|
|
if they match a normal (non-**) glob pattern. For example, if '/lnk' is a
|
|
symlink to a directory, '/lnk/**' and '/l?k/**' now work as you would expect.
|
|
|
|
- Fixed a bug introduced on 2021-02-11 that caused job control on interactive
|
|
ksh sessions to misbehave if the login shell was replaced by ksh using 'exec'.
|
|
|
|
2021-03-06:
|
|
|
|
- Fixed an old expansion bug: expansions of type ${var=value} and ${var:=value}
|
|
did not perform an assignment and yielded the value 0 if 'var' was typeset as
|
|
numeric (integer or float) but had not yet been assigned a value.
|
|
|
|
- Fixed a bug introduced on 2020-08-19: Ctrl+D would break after an
|
|
interactive shell received SIGWINCH.
|
|
|
|
- Fixed a bug introduced on 2020-05-21: on an interactive shell, command lines
|
|
containing a syntax error were not added to the command history file and
|
|
sometimes corrupted the command history.
|
|
|
|
2021-03-05:
|
|
|
|
- Unbalanced quotes and backticks now correctly produce a syntax error
|
|
in -c scripts, 'eval', and backtick-style command substitutions.
|
|
|
|
2021-03-04:
|
|
|
|
- Fixed an arbitrary command execution vulnerability that occurred when
|
|
parsing the subscripts of arrays within arithmetic commands and expansion.
|
|
|
|
2021-03-01:
|
|
|
|
- Fixed the retention of size attributes when 'readonly' or 'typeset -r'
|
|
was applied to an existing variable.
|
|
|
|
2021-02-26:
|
|
|
|
- Fixed three long-standing bugs with tab completion in the emacs editor:
|
|
|
|
1. The editor accepted literal tabs without escaping in certain cases,
|
|
causing buggy and inconsistent completion behaviour. Details:
|
|
https://github.com/ksh93/ksh/issues/71#issuecomment-656970959
|
|
https://github.com/ksh93/ksh/issues/71#issuecomment-657216472
|
|
To enter a literal tab in emacs, you need to escape it with ^V or \.
|
|
|
|
2. After completing a filename by choosing from a file completion menu,
|
|
the terminal cursor was placed one position too far to the right,
|
|
corrupting command line display. This happened with multiline active.
|
|
Details: https://github.com/ksh93/ksh/issues/71#issue-655093805
|
|
|
|
3. A completion menu was displayed if the file name to be completed was
|
|
at the point where the rest of it started with a number, even if that
|
|
part uniquely identified it so the menu only showed one item. Details:
|
|
https://www.mail-archive.com/ast-users@lists.research.att.com/msg00436.html
|
|
|
|
- A bug with ${.sh.fun} in combination with the DEBUG trap has been fixed.
|
|
The ${.sh.fun} variable wrongly continued to contain the name of the last
|
|
function executed by the DEBUG trap after the trap action completed.
|
|
|
|
2021-02-21:
|
|
|
|
- Fixed: The way that SIGWINCH was handled (i.e. the signal emitted when the
|
|
terminal window size changes) could cause strange emacs/vi editor behaviour.
|
|
|
|
2021-02-20:
|
|
|
|
- Fixed a bug introduced on 2021-01-20: if a DEBUG trap action yielded exit
|
|
status 2, the execution of the next command was not skipped as documented.
|
|
|
|
- Fixed multiple buffer overflows causing crashes in typeset -L/-R-/-Z.
|
|
|
|
- Fixed typeset -Z zero-filling: if the number was zero, all zeros
|
|
were skipped when changing the initial size value of the -Z attribute,
|
|
leaving an empty string.
|
|
|
|
2021-02-18:
|
|
|
|
- A bug was fixed in the 'read' builtin that caused it to fail to process
|
|
multibyte characters properly in Shift-JIS locales.
|
|
|
|
2021-02-17:
|
|
|
|
- Emacs mode fixes:
|
|
1. Erasing a backslash while doing a reverse search (^R) no longer deletes
|
|
extra characters.
|
|
2. The backslash now escapes a subsequent interrupt (^C) as documented.
|
|
|
|
- Fixed a longstanding bug with shared-state command substitutions of the form
|
|
${ command; }. If these were executed in a subshell, changes made within
|
|
could survive not only the command substitution but also the parent subshell.
|
|
|
|
2021-02-15:
|
|
|
|
- Fixed a regression introduced by ksh93 (was not in ksh88): an empty 'case'
|
|
list on a single line ('case x in esac') was a syntax error.
|
|
|
|
- Fixed a bug in the emacs built-in editor, introduced on 2020-09-17, that
|
|
made the Meta-D and Meta-H keys delete single characters instead of words.
|
|
|
|
- A new 'backslashctrl' shell option has been added. It is on by default.
|
|
Turning it off (set +o backslashctrl or set --nobackslashctrl) disables the
|
|
special escaping behaviour of the backslash character in the emacs and vi
|
|
built-in editors. Particularly in the emacs editor, this makes it much easier
|
|
to go back, insert a forgotten backslash into a command, and then continue
|
|
editing without having your next cursor key replace your backslash with
|
|
garbage. Note that Ctrl+V (or whatever other character was set using
|
|
'stty lnext') always escapes all control characters in either editing mode.
|
|
|
|
2021-02-14:
|
|
|
|
- Due to a deficiency in some UNIX veriants, the 'sleep' built-in command could
|
|
occasionally sleep for slightly less than the time specified. It now performs
|
|
an additional check against the system clock to make sure it sleeps at least
|
|
the given amount of time. Thanks to Lev Kujawski for adding this feature.
|
|
|
|
- A few bugs were fixed that 93u+m introduced along with the new '-o posix'
|
|
shell option on 2020-09-01:
|
|
1. 'set --posix' now works as the expected equivalent of 'set -o posix'.
|
|
2. As of 2020-09-18, the posix option turns off braceexpand and turns on
|
|
letoctal. Any attempt to override that in a single command such as
|
|
'set -o posix +o letoctal' was quietly ignored. This now works as long
|
|
as the overriding option follows the posix option on the command line.
|
|
3. The --default option to 'set' now stops the 'posix' option, if set or
|
|
unset in the same 'set' command, from changing other options. This allows
|
|
the command output by 'set +o' to correctly restore the current options.
|
|
|
|
2021-02-11:
|
|
|
|
- Fixed a bug that caused ksh to lose track of all running background jobs if
|
|
a shared-state command substitution of the form v=${ cmd; } was used twice.
|
|
|
|
- Job control (the -m/-o monitor option) has been fixed for scripts. Background
|
|
jobs are now correctly assigned their own process group when run from
|
|
subshells (except command substitutions). The 'fg' command now also works for
|
|
scripts as it does on other shells, though 'wait' should be preferred.
|
|
|
|
2021-02-05:
|
|
|
|
- Fixed a longstanding bug that caused redirections that store a file
|
|
descriptor > 10 in a variable, such as {var}>file, to stop working if
|
|
brace expansion (the -B or -o braceexpand option) was turned off. (Note
|
|
that '{var}' is not a brace expansion as it does not contain ',' or '..'.)
|
|
|
|
2021-02-04:
|
|
|
|
- Fixed ksh crashing if an autoloaded function tried to autoload itself.
|
|
ksh now errors out gracefully with an "autoload loop" error message.
|
|
|
|
- Fixed crash on trying a very long nonexistent command.
|
|
|
|
2021-02-01:
|
|
|
|
- Fixed a bug in 'typeset': the '-s' modifier option for short integer will
|
|
now only be applied if the integer option '-i' is also present, avoiding
|
|
inconsistent results and a crash.
|
|
|
|
- Fixed: scalar arrays (-a) and associative arrays (-A) of a type created by
|
|
'enum' allowed values not specified by the enum type, corrupting results.
|
|
|
|
- Fixed: the "${array[@]}" expansion for associative arrays of a type created
|
|
by 'enum' expanded to random numbers instead of the array's values.
|
|
|
|
2021-01-30:
|
|
|
|
- The -x option to the 'command' built-in now causes it to bypass built-ins
|
|
so that it always runs/queries an external command. See 'command --man'.
|
|
|
|
- Fixed a bug in 'command -x' that caused the minimum exit status to be 1 if
|
|
a command with many arguments was divided into several command invocations.
|
|
|
|
- The 2020-08-16 fix is improved with a compile-time feature test that
|
|
detects if the OS requires extra bytes per argument in the arguments list,
|
|
maximising the efficiency of 'command -x' for the system it runs on.
|
|
|
|
2021-01-24:
|
|
|
|
- Fixed a bug in 'typeset': combining the -u option with -F or -E caused the
|
|
variable to become a hexadecimal floating point in error.
|
|
|
|
- Fixed: an unquoted variable expansion evaluated in a DEBUG trap action caused
|
|
IFS field splitting to be deactivated in code executed after the trap action.
|
|
This bug was introduced in ksh 93t+ 2009-11-30.
|
|
|
|
2021-01-23:
|
|
|
|
- Fixed: when the DEBUG trap was redefined in a subshell, the DEBUG trap in
|
|
the parent environment was corrupted or the shell crashed.
|
|
When a redirection was used in a DEBUG trap action, the trap was disabled.
|
|
DEBUG traps were also incorrectly inherited by subshells and ksh functions.
|
|
All this was caused by a bug introduced in ksh 93t 2008-07-25.
|
|
|
|
2021-01-22:
|
|
|
|
- Compile-time shell options can now be edited in src/cmd/ksh93/SHOPT.sh
|
|
before building.
|
|
|
|
2021-01-20:
|
|
|
|
- Fixed: executing a DEBUG trap in a command substitution had side effects
|
|
on the exit status ($?) of non-trap commands.
|
|
This bug was introduced in ksh 93t 2008-11-04.
|
|
|
|
- The typeset builtin command now gives an informative error message if an
|
|
incompatible combination of options is given.
|
|
|
|
2021-01-19:
|
|
|
|
- Fixed a crash when using 'cd' in a virtual/non-forking subshell in a
|
|
situation where the current working directory cannot be determined.
|
|
|
|
2021-01-08:
|
|
|
|
- Fixed a crash on exceeding the maximum size of the $PS1 prompt.
|
|
The maximum size is also increased from 160 to 256 bytes.
|
|
|
|
2021-01-07:
|
|
|
|
- Fixed a crash that could occur while ksh updated ${.sh.match}.
|
|
|
|
- Any changes to the hash table (a.k.a. "tracked aliases", i.e. cached $PATH
|
|
searches) in a subshell now no longer affect the parent shell's hash table.
|
|
|
|
2021-01-05:
|
|
|
|
- Fixed a bug in 'cd' that caused 'cd ./foo' to search for 'foo' in $CDPATH.
|
|
|
|
2021-01-03:
|
|
|
|
- The invocation
|
|
$ ksh +s
|
|
caused an infinite loop and corrupted ~/.sh_history. This is now fixed so
|
|
that the '-s' option is automatically turned on if there are no non-option
|
|
command arguments, as documented in Bolsky & Korn (1995), p. 261.
|
|
|
|
2020-10-22:
|
|
|
|
- Fixed: 'typeset -F0', 'typeset -E0', and 'typeset -X0' floating point
|
|
numerics having a precision of 0 with variable assignment.
|
|
'typeset -F0 x; x=4.56' worked but not 'typeset -F0 x=4.56'.
|
|
|
|
2020-10-21:
|
|
|
|
- Fixed: More concisely correct the exporting of uppercase and lowercase
|
|
variables when only the export and change case attributes were applied.
|
|
This fix improves upon the previous 2020-09-30 modifications.
|
|
|
|
2020-10-06:
|
|
|
|
- The security of virtual/non-forking subshells that locally change the present
|
|
working directory (PWD) using 'cd' has been improved in two ways.
|
|
1. On entering a subshell, if the parent shell's PWD proves inaccessible upon
|
|
saving it, the subshell will now fork into a separate process so the
|
|
parent process never changes its PWD, avoiding the need to restore it.
|
|
2. If some attack renders the parent shell's PWD unrestorable *after* ksh
|
|
enters a virtual subshell, ksh will now error out on exiting it, as
|
|
continuing would mean running arbitrary commands in the wrong PWD.
|
|
Hopefully this is an acceptable compromise between performance and security.
|
|
The proper fix would be to always fork a subshell when changing the working
|
|
directory within it, but the resulting slowdown would likely be unpopular.
|
|
|
|
2020-09-30:
|
|
|
|
- Fixed: 'typeset -xu' and 'typeset -xl' (export + change case) failed to
|
|
change the case of a variable's value in certain conditions.
|
|
|
|
- A ksh 93u+ regression was fixed in the combination of ERR trap handling and
|
|
the 'pipefail' option. A pipeline now triggers the ERR trap correctly again
|
|
if the 'pipefail' option is active and any of the pipeline elements return a
|
|
nonzero exit status. Similarly, if both the 'errexit' and 'pipefail' options
|
|
are active, ksh now correctly exits if any pipeline element returns nonzero.
|
|
|
|
- Autoloading a function no longer causes the calling script's $LINENO to be
|
|
off by the number of lines in the function definition file that was loaded.
|
|
This also corrects line numbers in warnings and error messages.
|
|
|
|
2020-09-28:
|
|
|
|
- While executing a ksh-style function, ksh 93u+ ignored all signals for which
|
|
the function had not set a local trap, except for SIGINT and SIGQUIT. This
|
|
was contrary to the manual, which states that a "trap condition that is not
|
|
caught or ignored by the function causes the function to terminate and the
|
|
condition to be passed on to the caller". This has now been fixed in 93u+m to
|
|
match the documentation, so that e.g. global traps work as expected again.
|
|
|
|
2020-09-27:
|
|
|
|
- The shell's lexical analysis of a 'case' statement within a do...done block
|
|
within a command substitution of the form $(...) has been fixed so that code
|
|
like the following no longer throws a spurious syntax error:
|
|
x=$(for i in 1; do case $i in word) true;; esac; done)
|
|
Previously, this required a leading parenthesis before 'word', although the
|
|
syntax error claimed that the ';;' was unexpected.
|
|
|
|
2020-09-26:
|
|
|
|
- 'whence -f' now completely ignores the existence of functions, as documented.
|
|
|
|
- ksh now does not import environment variables whose names are not valid in
|
|
the shell language, as it would be impossible to change or unset them.
|
|
However, they stay in the environment to be passed to child processes.
|
|
|
|
2020-09-25:
|
|
|
|
- whence -v/-a now reports the path to the file that an "undefined" (i.e.
|
|
autoloadable) function will be loaded from when invoked, if found in $FPATH.
|
|
|
|
- When ksh invoked a shell script that does not have a leading
|
|
#!/hashbang/path, 'ps' and /proc/<PID>/cmdline showed corrupted output if
|
|
the new script's command line was shorter than that of the invoking script.
|
|
This has been fixed by wiping the arguments buffer correctly.
|
|
|
|
2020-09-24:
|
|
|
|
- An omission made it impossible to turn off brace expansion within command
|
|
substitutions (`...`, $(...) or ${ ...; }) as the code for parsing these
|
|
did not check the -B/braceexpand option. This check has now been added.
|
|
|
|
2020-09-23:
|
|
|
|
- Fixed a crash that could occur when running a pipeline containing
|
|
backtick-style command substitutions with job control enabled.
|
|
|
|
- Fixed a crash that occurred when using 'typeset -u' or 'typeset -l' on a
|
|
special variable such as PATH, ENV or SHELL.
|
|
|
|
2020-09-21:
|
|
|
|
- A bug was fixed that caused command substitutions embedded in here-documents
|
|
to lose the output of the commands they ran. This bug occurred when ksh was
|
|
compiled with the SHOPT_SPAWN compile-time option.
|
|
|
|
- Bugfix: var=$(< file) now reads the file even if the standard inout, standard
|
|
output and/or standard error file descriptors are closed.
|
|
|
|
2020-09-20:
|
|
|
|
- Bugfix: when whence -v/-a found an "undefined" (i.e. autoloadable) function
|
|
in $FPATH, it actually loaded the function as a side effect of reporting on
|
|
its existence. Now it only reports, as documented.
|
|
|
|
- 'whence' will now canonicalise paths properly, resolving '.' and '..'
|
|
elements in paths given to it. It also no longer prefixes a spurious
|
|
double slash when doing something like 'cd / && whence bin/echo'.
|
|
|
|
2020-09-18:
|
|
|
|
- Setting the 'posix' option now turns off the 'braceexpand' option, as brace
|
|
expansion is not specified by POSIX and potentially incompatible with sh
|
|
scripts. In addition, 'set -o posix' now turns on the 'letoctal' option
|
|
instead of controlling that behaviour directly. 'set +o posix' does the
|
|
reverse of these.
|
|
|
|
2020-09-17:
|
|
|
|
- In the vi and emacs line editors, repeat count parameters can now also be
|
|
used for the arrow keys and the forward-delete key. E.g., in emacs mode,
|
|
<ESC> 7 <left-arrow> will now move the cursor seven positions to the left.
|
|
In vi control mode, this would be entered as: 7 <left-arrow>.
|
|
|
|
- When a background job on an interactive shell received SIGINT or SIGPIPE, the
|
|
job termination message was empty. It now shows "Interrupt" or "Broken Pipe".
|
|
|
|
- The -m (-o monitor) option is no longer ignored when specified on the shell
|
|
invocation command line.
|
|
|
|
- A script that is interrupted with Ctrl+C now terminates its background jobs
|
|
as expected, unless the -m (-o monitor) option was turned on.
|
|
|
|
2020-09-14:
|
|
|
|
- Corrected rounding of floating point values by ksh's printf %f formatting
|
|
operator. Fix contributed by @hyenias.
|
|
|
|
- The forward-delete key now works as expected in emacs and vi editing modes.
|
|
|
|
2020-09-11:
|
|
|
|
- The 'command' regular builtin utility (which runs a simple command, removing
|
|
special properties) has been made fully POSIX compliant.
|
|
1. The 'command' name can now result from an expansion (fixing BUG_CMDEXPAN),
|
|
e.g. 'c=command; "$c" ls' and 'set -- command ls; "$@"' now work.
|
|
2. If and only if the POSIX mode (the new -o posix shell option) is active,
|
|
then the 'command' utility now disables not only "special" but also
|
|
"declaration" properties of builtin commands that it invokes, meaning:
|
|
a. arguments that start with a variable name followed by '=' are
|
|
always treated as regular words subject to normal shell syntax;
|
|
b. 'command' can now stop the shell from exiting if a command that it
|
|
invokes tries to modify a readonly variable (fixing BUG_CMDSPEXIT).
|
|
|
|
- The 'history' (== 'hist -l') and 'r' (== 'hist -s') interactive shell
|
|
history commands have reverted to preset aliases and are now only loaded if
|
|
the shell is interactive and not initialised in POSIX mode. This avoids
|
|
unneeded conflicts with external commands by these names, particularly 'r'.
|
|
|
|
2020-09-09:
|
|
|
|
- Fixed BUG_LOOPRET2 and related bugs. The 'exit' and 'return' commands without
|
|
an argument now correctly default to passing down the exit status of the
|
|
last-run command. Tests like the following, in which the last-run command is
|
|
'false', now correctly output 1 instead of 0:
|
|
fn() { return || true; }; false; fn; echo "$?"
|
|
fn() { while return; do true; done; }; false; fn; echo "$?"
|
|
fn() { for i in 1; do return; done; }; false; fn; echo "$?"
|
|
fn() { case 1 in 1) return ;; esac; }; false; fn; echo "$?"
|
|
fn() { { return; } 2>&1; }; false; fn; echo "$?"
|
|
|
|
2020-09-05:
|
|
|
|
- Fixed erroneous syntax errors in parameter expansions such as ${var:-wor)d}
|
|
or ${var+w(ord}. The parentheses now correctly lose their normal grammatical
|
|
meaning within the braces. Fix by Eric Scrivner backported from ksh2020.
|
|
|
|
2020-09-04:
|
|
|
|
- Fixed a bug that caused a syntax error to be thrown if the special parameter
|
|
expansions ${!} and ${$} (including braces) were used within a here-document.
|
|
Bug reported by @Saikiran-m on GitHub.
|
|
|
|
2020-09-01:
|
|
|
|
- The bash-style '&>file' redirection shorthand (for '>file 2>&1') is now
|
|
always recognised and not only when running rc/profile init scripts. It no
|
|
longer issues a warning. This brings ksh93 in line with mksh, bash and zsh.
|
|
|
|
- A long-form shell option '-o posix' has been added, which implements a
|
|
mode for better compatibility with the POSIX standard. It is automatically
|
|
turned on if ksh is invoked under the name 'sh'.
|
|
For now, it:
|
|
* disables the &> redirection shorthand
|
|
* causes the 'let' arithmetic command to recognise octal numbers by
|
|
leading zeros regardless of the setting of the 'letoctal' option
|
|
* causes file descriptors > 2 to be left open when invoking another program
|
|
* makes the <> redirection operator default to stdin instead of stdout
|
|
(this keeps the 2020-05-13 BUG_REDIRIO fix for the POSIX mode while
|
|
restoring traditional ksh93 behaviour for backwards compatibility)
|
|
* disables a noncompliant 'test -t' == 'test -t 1' compatibility hack
|
|
* disables passing an exported variable's attributes (such as integer or
|
|
readonly) to a new ksh process through the environment
|
|
|
|
2020-08-19:
|
|
|
|
- Sped up the 'read' command on most systems by 15-25%. Fixed a hanging bug
|
|
on reading from a FIFO that could occur on macOS.
|
|
|
|
2020-08-17:
|
|
|
|
- 'command -p' incorrectly used the hash table entry (a.k.a. tracked alias)
|
|
for a command if its path was previously hashed. It has now been fixed so
|
|
it never consults the hash table.
|
|
|
|
2020-08-16:
|
|
|
|
- Fixed 'command -x' on macOS, Linux and Solaris by accounting for a 16-byte
|
|
argument alignment. If execution does fail, it now aborts with an internal
|
|
error message instead of entering an infinite retry loop.
|
|
|
|
2020-08-13:
|
|
|
|
- Fixed memory leaks and a crashing bug that occurred when defining and
|
|
running functions in subshells.
|
|
|
|
2020-08-11:
|
|
|
|
- Fixed an intermittent crash upon running a large number of subshells.
|
|
|
|
2020-08-10:
|
|
|
|
- A number of fixes have been applied to the printf formatting directives
|
|
%H and %#H (as well as the undocumented equivalents %(html)q and %(url)q):
|
|
1. Both formatters have been made multibyte/UTF-8 aware, and no longer
|
|
delete multibyte characters. Invalid UTF-8 byte sequences are rendered
|
|
as ASCII question marks.
|
|
2. %H no longer wrongly changes spaces to non-breaking spaces ( ).
|
|
3. %H now converts the single quote (') to '%#39;' instead of '''
|
|
which is not a valid entity in all HTML versions.
|
|
4. %#H failed to encode some reserved characters (e.g. '?') while encoding
|
|
some unreserved ones (e.g. '~'). It now percent-encodes all characters
|
|
except those 'unreserved' as per RFC3986 (ASCII alphanumeric plus -._~).
|
|
|
|
- Fixed a crash that occurred intermittently after running an external
|
|
command from a command substitution expanded from the $PS1 shell prompt.
|
|
|
|
2020-08-09:
|
|
|
|
- File name generation (a.k.a. pathname expansion, a.k.a. globbing) now
|
|
never matches the special navigational names '.' (current directory) and
|
|
'..' (parent directory). This change makes a pattern like .* useful; it
|
|
now matches all hidden files (dotfiles) in the current directory, without
|
|
the harmful inclusion of '.' and '..'.
|
|
|
|
2020-08-08:
|
|
|
|
- Argument checking in the 'redirect' builtin command (see 2020-06-11) has
|
|
been improved to error out before executing redirections. For example, an
|
|
error like 'redirect ls >foo.txt' now will not create 'foo.txt' and will
|
|
not leave your standard output permanently redirected to it.
|
|
|
|
2020-08-06:
|
|
|
|
- Added the '${.sh.pid}' variable as an alternative to Bash's '$BASHPID'.
|
|
This variable is set to the current shell's PID, unlike '$$' (which is
|
|
set to the parent shell's PID). In virtual subshells '${.sh.pid}' is not
|
|
changed from its previous value, while in forked subshells '${.sh.pid}'
|
|
is set to the subshell's process ID.
|
|
|
|
2020-08-05:
|
|
|
|
- Fixed a bug in functions that caused ksh to crash when an array with an
|
|
unset method was turned into a multidimensional array.
|
|
|
|
- Fixed a bug that caused scripts to continue running after over-shifting
|
|
in a function when the function call had a redirection.
|
|
|
|
- When generating shellquoted strings (such as with 'printf %q'), the
|
|
hexadecimal value of a quoted unprintable character was not protected with
|
|
square braces, e.g. 0x12 followed by '3' would be quoted as '\x123', which
|
|
is a different value. Such strings are now quoted like '\x[12]3' if the
|
|
next character is a hexadecimal digit.
|
|
|
|
2020-07-31:
|
|
|
|
- Fixed a bug that caused multidimensional associative arrays to be created
|
|
with an extra array member.
|
|
|
|
- Fixed a bug that caused the expansions of positional parameters $1 - $9,
|
|
as well as special parameters such as $? and $-, to corrupt any multibyte
|
|
characters immediately following the expansion if a UTF-8 locale is active.
|
|
|
|
2020-07-29:
|
|
|
|
- On a ksh compiled to use fork(2) to run external commands, a bug has been
|
|
fixed that caused signals (such as SIGINT, Ctrl+C) to be ignored within a
|
|
non-forked subshell after running an external command within that subshell.
|
|
|
|
2020-07-25:
|
|
|
|
- Fixed BUG_MULTIBIFS: Multibyte characters can now be used as IFS
|
|
delimiters. "$*" was incorrectly joining positional parameters on
|
|
the first byte of a multibyte character. This was due to truncation
|
|
based on the incorrect assumption the IFS would never be larger
|
|
than a single byte.
|
|
|
|
- Fixed a bug that caused the sleep builtin to continue after being given
|
|
an unrecognized option. 'sleep -: 1' will now show a usage message and
|
|
exit instead of sleep for one second.
|
|
|
|
- Fixed a bug that caused the 'typeset' variable attributes -a, -A, -l, and
|
|
-u to leak out of a subshell if they were set without assigning a value.
|
|
|
|
2020-07-23:
|
|
|
|
- Fixed an infinite loop that could occur when ksh is the system's /bin/sh.
|
|
|
|
- A command substitution that is run on the same line as a here-document
|
|
will no longer cause a syntax error.
|
|
|
|
2020-07-22:
|
|
|
|
- Fixed two race conditions when running external commands on
|
|
interactive shells with job control active.
|
|
|
|
2020-07-20:
|
|
|
|
- If a shell function and a built-in command by the same name exist,
|
|
'whence -a' and 'type -a' now report both.
|
|
|
|
- Fixed a bug that caused file descriptors opened with 'redirect' or 'exec'
|
|
to survive a subshell environment after exiting it.
|
|
|
|
2020-07-19:
|
|
|
|
- Fixed a crash that occurred in the '.' command when using kshdb.
|
|
|
|
- Fixed a crash that occurred when attempting to use redirection with an
|
|
invalid file descriptor.
|
|
|
|
2020-07-16:
|
|
|
|
- The 'history' and 'r' default aliases have been made regular built-ins,
|
|
leaving zero default aliases.
|
|
|
|
- Fixed a bug that caused 'sleep -s' to have no effect with intervals longer
|
|
than 30 seconds.
|
|
|
|
- The accuracy of the sleep builtin has been improved. It no longer ignores
|
|
microseconds and doesn't add extra milliseconds when the interval is less
|
|
than 31 seconds.
|
|
|
|
2020-07-15:
|
|
|
|
- The 'autoload', 'compound', 'float', 'functions', 'integer' and 'nameref'
|
|
default aliases have been converted into regular built-in commands, so
|
|
that 'unalias -a' does not remove them. Shell functions can now use
|
|
these names, which improves compatibility with POSIX shell scripts.
|
|
|
|
- The End key escape sequence '^[[F' is now handled in the emacs and vi editing
|
|
modes. The End key moves the cursor to the end of the line (in contrast to
|
|
the Home key doing the opposite).
|
|
|
|
2020-07-14:
|
|
|
|
- Fixed a bug that caused 'set -b' to have no effect.
|
|
|
|
- Following the 'time' keyword, the 'times' builtin command now also
|
|
supports millisecond precision.
|
|
|
|
2020-07-13:
|
|
|
|
- Fixed a fork bomb that could occur when the vi editor was sent SIGTSTP
|
|
while running in a ksh script.
|
|
|
|
- Appending a lone percent to the end of a format specifier no longer
|
|
causes a syntax error. The extra percent will be treated as a literal
|
|
'%', like in Bash and zsh.
|
|
|
|
- The 'time' keyword now has proper support for millisecond precision.
|
|
Although this feature was previously documented, the 'time' keyword
|
|
only supported up to centisecond precision, which caused a command
|
|
like the one below to return '0.000' on certain operating systems:
|
|
$ TIMEFORMAT='%3R'; time sleep .003
|
|
|
|
- The 'time' keyword now zero-pads seconds less than ten (like mksh).
|
|
|
|
2020-07-10:
|
|
|
|
- Fixed a bug that caused types created with 'typeset -T' to throw an error
|
|
when used if the type name started with a lowercase 'a'.
|
|
|
|
- A potential crash due to memory corruption when using many file
|
|
descriptors has been fixed.
|
|
|
|
2020-07-09:
|
|
|
|
- Fixed a crash on syntax error when sourcing/dotting multiple files.
|
|
|
|
- Fixed a crash when listing indexed arrays.
|
|
|
|
- Fixed a memory leak when restoring PATH when temporarily setting PATH
|
|
for a command (e.g. PATH=/foo/bar command ...) or in a virtual subshell.
|
|
|
|
- Combining ((...)) with redirections no longer causes a syntax error
|
|
due to the parser handling '>' incorrectly.
|
|
|
|
- Fixed a bug that corrupted KIA/CQL cross-reference databases created using
|
|
ksh's -R option; shell warnings were wrongly included in the database file.
|
|
|
|
- The shell's quoting algorithm (used in xtrace, printf %q, and more) has been
|
|
fixed for UTF-8 (Unicode) locales; it no longer needlessly and inconsistently
|
|
encodes normal printable UTF-8 characters into hexadecimal \u[xxxx] codes.
|
|
|
|
2020-07-07:
|
|
|
|
- Four of the date formats accepted by 'printf %()T' have had their
|
|
functionality altered to the common behavior of date(1):
|
|
- '%k' and '%l' print the current hour with blank padding, the former
|
|
based on a 24-hour clock and the latter a twelve hour clock. These
|
|
are common extensions present on Linux and *BSD.
|
|
- '%f' prints a date with the format string '%Y.%m.%d-%H:%M:%S' (BusyBox).
|
|
- '%q' prints the quarter of the year (GNU).
|
|
|
|
2020-07-06:
|
|
|
|
- 'notty' is now written to the ksh auditing file instead of '(null)' if
|
|
the user's tty could not be determined.
|
|
|
|
- Unsetting an associative array no longer causes a memory leak to occur.
|
|
|
|
2020-07-05:
|
|
|
|
- In UTF-8 locales, fix corruption of the shell's internal string quoting
|
|
algorithm (as used by xtrace, 'printf %q', and more) that occurred when
|
|
the processing of a multibyte character was interrupted.
|
|
|
|
2020-07-03:
|
|
|
|
- Backslashes are no longer escaped in the raw Bourne Shell-like editing
|
|
mode in multibyte locales, i.e. backslashes are no longer treated like
|
|
Control-V if the emacs and vi modes are disabled.
|
|
|
|
- Deleting a backslash in vi mode with Control-H or Backspace now only
|
|
escapes a backslash if it was the previous input. This means erasing a
|
|
string such as 'ab\\\' will only cause the first backslash to escape a
|
|
Backspace as '^?', like in emacs mode.
|
|
|
|
- An odd interaction with Backspace when the last character of a separate
|
|
buffer created with Shift-C was '\' has been fixed. '^?' will no longer
|
|
be output repeatedly when attempting to erase a separate buffer with
|
|
a Backspace. Note that buffers created with Shift-C are not meant to be
|
|
erasable:
|
|
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/vi.html#tag_20_152_13_49
|
|
|
|
- The 'kill' builtin now supports the SIGINFO signal (on operating systems
|
|
with support for SIGINFO).
|
|
|
|
2020-07-02:
|
|
|
|
- Fixed a crash that occurred if a directory named '.paths' existed in any
|
|
directory listed in $PATH. The fix was to only read '.paths' if it is a
|
|
regular file or a symlink to a regular file.
|
|
|
|
2020-06-30:
|
|
|
|
- 'read -u' will no longer crash with a memory fault when given an out of
|
|
range or negative file descriptor.
|
|
|
|
- The '=~' operator no longer raises an error if a regular expression
|
|
combines the '{x}' quantifier with a sub-expression.
|
|
|
|
2020-06-28:
|
|
|
|
- Variables created with 'typeset -RF' no longer cause a memory fault
|
|
when accessed.
|
|
|
|
- Unsetting an array that was turned into a compound variable will no
|
|
longer cause silent memory corruption.
|
|
|
|
- Variables created with 'readonly' in functions are now set to the
|
|
specified value instead of nothing. Note that 'readonly' does not
|
|
create a function-local scope, unlike 'typeset -r' which does.
|
|
|
|
2020-06-26:
|
|
|
|
- Changing to a directory that has a name starting with a '.' will no
|
|
longer fail if preceded by '../' (i.e. 'cd ../.local' will now work).
|
|
|
|
2020-06-24:
|
|
|
|
- Fixed buggy tab completion of tilde-expanded paths such as
|
|
~/some in 'vi' mode.
|
|
|
|
- In the raw/default Bourne Shell-like editing mode that occurs when neither
|
|
the 'emacs' nor the 'vi' shell option is active:
|
|
* tab completion is now correctly disabled, instead of enabled and broken;
|
|
* entering tab characters now moves the cursor the correct amount.
|
|
|
|
2020-06-23:
|
|
|
|
- Fixed a bug that caused combining process substitution with redirection
|
|
to create a bizarre file in the user's current working directory.
|
|
|
|
- Using process substitution while the shell is interactive no longer
|
|
causes the process ID of the asynchronous process to be printed.
|
|
|
|
2020-06-22:
|
|
|
|
- The 'stop' and 'suspend' default aliases have been converted into regular
|
|
built-in commands, so that 'unalias -a' does not remove them, 'suspend'
|
|
can do a couple of sanity checks, and something like
|
|
cmd=stop; $cmd $!
|
|
will now work. See 'stop --man' and 'suspend --man' for more information.
|
|
|
|
- Fixed a bug that caused the kill and stop commands to segfault when given
|
|
a non-existent job.
|
|
|
|
- Nested functions no longer ignore variable assignments that were prefixed
|
|
to their parent function, i.e. 'VAR=foo func' will now set $VAR to 'foo'
|
|
in the scope of any nested function 'func' runs.
|
|
|
|
2020-06-20:
|
|
|
|
- Fixed a bug that caused setting the following variables as readonly in
|
|
a virtual subshell to affect the environment outside of the subshell:
|
|
$_
|
|
${.sh.name}
|
|
${.sh.subscript}
|
|
${.sh.level}
|
|
$RANDOM
|
|
$LINENO
|
|
|
|
- Fixed two bugs that caused 'unset .sh.lineno' to always produce a memory
|
|
fault and '(unset .sh.level)' to memory fault when run in nested
|
|
functions.
|
|
|
|
2020-06-18:
|
|
|
|
- A two decade old bug that caused 'whence -a' to base the path of
|
|
tracked aliases on the user's current working directory has been
|
|
fixed. Now the real path to tracked aliases is shown when '-a' is
|
|
passed to the whence command.
|
|
|
|
2020-06-17:
|
|
|
|
- A bug in 'unset -f' was fixed that prevented shell functions from
|
|
unsetting themselves while they were running. A POSIX function no longer
|
|
crashes when doing so, and a KornShell-style function no longer silently
|
|
ignores an 'unset -f' on itself. A function of either form now continues
|
|
running after unsetting itself, and is removed at the end of the run.
|
|
|
|
2020-06-16:
|
|
|
|
- Passing the '-d' flag to the read builtin will no longer cause the '-r'
|
|
flag to be discarded when 'read -r -d' is run.
|
|
|
|
- Fix BUG_CMDSPASGN: preceding a "special builtin"[*] with 'command' now
|
|
prevents preceding invocation-local variable assignments from becoming global.
|
|
[*] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14
|
|
|
|
2020-06-15:
|
|
|
|
- The 'source' alias has been converted into a regular built-in command.
|
|
|
|
- Functions that set variables in a virtual subshell will no longer affect
|
|
variables of the same name outside of the virtual subshell's environment.
|
|
|
|
- Terse usage messages written by builtin commands now point the user to
|
|
the --help and --man options for more information.
|
|
|
|
2020-06-14:
|
|
|
|
- 'read -S' is now able to correctly handle strings with double quotes
|
|
nested inside of double quotes.
|
|
|
|
2020-06-13:
|
|
|
|
- Fixed a timezone name determination bug on FreeBSD that caused the
|
|
output from "LC_ALL=C printf '%T\n' now" to print the wrong time zone name.
|
|
|
|
2020-06-11:
|
|
|
|
- Fixed a bug that caused running 'builtin -d' on a special builtin to
|
|
delete it. The man page for the 'builtin' command documents that special
|
|
builtins cannot be deleted.
|
|
|
|
- POSIX compliance fix: It is now possible to set shell functions named
|
|
'alias' or 'unalias', overriding the commands by the same names. In
|
|
technical terms, they are now regular builtins, not special builtins.
|
|
|
|
- The redirect='command exec' alias has been converted to a regular
|
|
'redirect' builtin command that only accepts I/O redirections, which
|
|
persist as in 'exec'. This means that:
|
|
* 'unlias -a' no longer removes the 'redirect' command;
|
|
* users no longer accidentally get logged out of their shells if
|
|
they type something intuitive but wrong, like 'redirect ls >file'.
|
|
|
|
- The undocumented 'login' and 'newgrp' builtin commands have been removed.
|
|
These replaced your shell session with the external commands by the same
|
|
name, as in 'exec'. If an error occurred (e.g. due to a typo), you would
|
|
end up immediately logged out.
|
|
If you do want this behaviour, you can restore it by setting:
|
|
alias login='exec login'
|
|
alias newgrp='exec newgrp'
|
|
|
|
2020-06-10:
|
|
|
|
- The 'hash' utility is now a regular builtin instead of an alias to
|
|
'alias -t --'. The functionality of the old command has been removed
|
|
from the alias builtin.
|
|
|
|
- 'set +r' is no longer able to unset the restricted option. This change
|
|
makes the behavior of 'set +r' identical to 'set +o restricted'.
|
|
|
|
2020-06-09:
|
|
|
|
- The 'unalias' builtin will now return a non-zero status if it tries
|
|
to remove a previously set alias that is not currently set.
|
|
|
|
2020-06-08:
|
|
|
|
- Fix an issue with the up arrow key in Emacs editing mode.
|
|
Emacs editing mode is bugged in ksh93u+ and ksh2020. Let's
|
|
say you were to run the following commands after starting
|
|
a fresh instance of ksh:
|
|
$ alias foo=true
|
|
$ unalias foo
|
|
If you type 'a' and then press the up arrow on your keyboard,
|
|
ksh will complete 'a' to 'alias foo=true' by doing a reverse
|
|
search for the last command that starts with 'a'.
|
|
Run the alias command again, then type 'u' and press the up
|
|
arrow key again. If ksh is in Vi mode, you will get 'unalias foo',
|
|
but in Emacs mode you will get 'alias foo=true' again.
|
|
All subsequent commands were ignored as ksh was saving the first
|
|
command and only based later searches off of it.
|
|
|
|
- If 'set -u'/'set -o nounset' is active, then the shell now errors out if a
|
|
nonexistent positional parameter such as $1, $2, ... is accessed, as other
|
|
shells do and POSIX requires. (This does *not* apply to "$@" and "$*".)
|
|
|
|
- If 'set -u'/'set -o nounset' is active, then the shell now errors out if $!
|
|
is accessed before the shell has launched any background process.
|
|
|
|
- Removed support for an obscure early 1990s Bell Labs file system research
|
|
project called 3DFS, which has not existed for decades. This removes:
|
|
- an obnoxious default alias 2d='set -f;_2d' that turned off your file name
|
|
wildcard expansion and then tried to run a nonexistent '_2d' command
|
|
- undocumented builtins 'vmap' and 'vpath' that only printed error messages
|
|
- a non-functional -V unary operator for the test and [[ commands
|
|
|
|
- If the last program run by a ksh script exits with a signal (e.g. crashed),
|
|
ksh itself now exits normally instead of repeating that same signal.
|
|
In addition, using 'exit x' for x > 256 no longer makes ksh issue a signal.
|
|
|
|
2020-06-06:
|
|
|
|
- The 'times' command is now a builtin command that conforms to POSIX
|
|
instead of an alias for the 'time' command. It displays the accumulated
|
|
user and system CPU times, one line with the times used by the shell and
|
|
another with those used by all of the shell's child processes.
|
|
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_27
|
|
|
|
- The default aliases command='command ' and nohup='nohup ' have been
|
|
removed because they caused breakage in an attempt to circumvent other
|
|
breakage which is being fixed. In the unlikely even that anyone still
|
|
needs alias substitution to continue on the command argument following
|
|
'command' or 'nohup', it's easy to set these aliases yourself.
|
|
|
|
2020-06-05:
|
|
|
|
- Fix a bug that caused special variables such as PATH, LANG, LC_ALL,
|
|
etc. to lose their effect after being unset in a subshell. For example:
|
|
(unset PATH; PATH=/dev/null; ls); : wrongly ran 'ls'
|
|
(unset LC_ALL; LC_ALL=badlocale); : failed to print a diagnostic
|
|
This also fixes BUG_KUNSETIFS: unsetting IFS in a subshell failed if IFS
|
|
was set to the empty value in the parent shell.
|
|
|
|
- Fix crashes on some systems, including at least a crash in 'print -v' on
|
|
macOS, by eliminating an invalid/undefined use of memccpy() on overlapping
|
|
buffers in the commonly used sfputr() function.
|
|
|
|
- Fix the ${.sh.subshell} level counter; it is no longer reset to zero when a
|
|
non-forked subshell happens to fork into a separate process for some reason
|
|
(an internal implementation detail that should be unnoticeable to scripts).
|
|
|
|
2020-06-04:
|
|
|
|
- Fix BUG_KBGPID: the $! special parameter was not set if a background job
|
|
(somecommand &) or co-process (somecommand |&) was launched as the only
|
|
command within a braces block with an attached redirection, for example:
|
|
{
|
|
somecommand &
|
|
} >&2
|
|
With the bug, $! was unchanged; now it contains the PID of somecommand.
|
|
|
|
2020-05-31:
|
|
|
|
- Fix a bug in autoloading functions. Directories in the path search list
|
|
which should be skipped (e.g. because they don't exist) did not interact
|
|
correctly with autoloaded functions, so that a function to autoload was
|
|
not always found correctly.
|
|
Details: https://github.com/att/ast/issues/1454
|
|
|
|
2020-05-30:
|
|
|
|
- Fix POSIX compliance of 'test'/'[' exit status on error. The command now
|
|
returns status 2 instead of 1 when given an invalid number or arithmetic
|
|
expression, e.g.:
|
|
[ 123 -eq 123x ]; echo $?
|
|
now outputs 2 instead of 1.
|
|
|
|
2020-05-29:
|
|
|
|
- Fix BUG_FNSUBSH: functions can now be correctly redefined and unset in
|
|
subshell environments (such as ( ... ), $(command substitutions), etc).
|
|
Before this fix, this was silently ignored, causing the function by the
|
|
same name from the parent shell environment to be executed instead.
|
|
fn() { echo mainsh; }
|
|
(fn() { echo subsh; }; fn); fn
|
|
This now correctly outputs "subsh mainsh" instead of "mainsh mainsh".
|
|
ls() { echo "ls executed"; }
|
|
(unset -f ls; ls); ls
|
|
This now correctly lists your directory and then prints "ls executed",
|
|
instead of printing "ls executed" twice.
|
|
|
|
- Fix a similar bug with aliases. These can now be correctly unset
|
|
in subshell environments.
|
|
|
|
2020-05-21:
|
|
|
|
- Fix truncating of files with the combined redirections '<>;file' and
|
|
'<#pattern'. The bug was caused by out-of-sync streams.
|
|
Details and discussion: https://github.com/att/ast/issues/61
|
|
|
|
- Patched code injection vulnerability CVE-2019-14868. As a result, you can
|
|
no longer use expressions in imported numeric environment variables; only
|
|
integer literals are allowed.
|
|
|
|
2020-05-20:
|
|
|
|
- Fix BUG_ISSETLOOP. Expansions like ${var+set} remained static when used
|
|
within a 'for', 'while' or 'until' loop; the expansions din't change along
|
|
with the state of the variable, so they could not be used to check whether a
|
|
variable is set within a loop if the state of that variable changed in the
|
|
course of the loop.
|
|
|
|
- Fix BUG_IFSISSET. ${IFS+s} always yielded 's', and [[ -v IFS ]] always
|
|
yielded true, even if IFS is unset. This applied to IFS only.
|
|
|
|
2020-05-19:
|
|
|
|
- Fix 'command -p'. The -p option causes the operating system's standard
|
|
utilities path (as output by 'getconf PATH') to be searched instead of $PATH.
|
|
Before this fix, this was broken on non-interactive shells as the internal
|
|
variable holding the default PATH value was not correctly initialised.
|
|
|
|
2020-05-16:
|
|
|
|
- Fix 'test -t 1', '[ -t 1 ]', '[[ -t 1 ]]' in command substitutions.
|
|
Standard output (file descriptor 1) tested as being on a terminal within a
|
|
command substitution, which makes no sense as the command substitution is
|
|
supposed to be catching standard output.
|
|
v=$(echo begincomsub
|
|
[ -t 1 ] && echo oops
|
|
echo endcomsub)
|
|
echo "$v"
|
|
This now does not output "oops".
|
|
|
|
2020-05-14:
|
|
|
|
- Fix syncing history when print -s -f is used. For example, the
|
|
following now correctly adds a 'cd' command to the history:
|
|
print -s -f 'cd -- %q\n' "$PWD"
|
|
Ref.: https://github.com/att/ast/issues/425
|
|
https://github.com/att/ast/pull/442
|
|
|
|
- Fix BUG_PUTIOERR: Output builtins now correctly detect
|
|
input/output errors. This allows scripts to check for a nonzero exit
|
|
status on the 'print', 'printf' and 'echo' builtins and prevent possible
|
|
infinite loops if SIGPIPE is ignored.
|
|
|
|
- Add a convenient bin/run_ksh_tests script to the source tree that
|
|
sets up the necessary environment and runs the ksh regression tests.
|
|
|
|
2020-05-13:
|
|
|
|
- Fix BUG_CASELIT: an undocumented 'case' pattern matching misbehaviour that
|
|
goes back to the original Bourne shell, but wasn't discovered until 2018.
|
|
If a pattern doesn't match as a pattern, it was tried again as a literal
|
|
string. This broke common validation use cases, e.g.:
|
|
n='[0-9]'
|
|
case $n in
|
|
( [0-9] ) echo "$n is a number" ;;
|
|
esac
|
|
would output "[0-9] is a number" as the literal string fallback matches the
|
|
pattern. As this misbehaviour was never documented anywhere (not for Bourne,
|
|
ksh88, or ksh93), and it was never replicated in other shells (not even in
|
|
ksh88 clones pdksh and mksh), it is unlikely any scripts rely on it.
|
|
Of course, a literal string fallback, should it be needed, is trivial to
|
|
implement correctly without this breakage:
|
|
case $n in
|
|
( [0-9] | "[0-9]") echo "$n is a number or the number pattern" ;;
|
|
esac
|
|
Ref.: https://github.com/att/ast/issues/476
|
|
|
|
- Fix BUG_REDIRIO: ksh used to redirect standard output by default when no
|
|
file descriptor was specified with the rarely used '<>' reading/writing
|
|
redirection operator. It now redirects standard input by default, as POSIX
|
|
specifies and as all other POSIX shells do. To redirect standard output
|
|
for reading and writing, you now need '1<>'.
|
|
Ref.: https://github.com/att/ast/issues/75
|
|
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_07
|