mirror of
				git://git.code.sf.net/p/cdesktopenv/code
				synced 2025-03-09 15:50:02 +00:00 
			
		
		
		
	This bug was first reported in <https://www.illumos.org/issues/7694>. The time keyword currently overrides the errexit shell option, allowing failing scripts to continue after an error: $ cat 1.sh #!/bin/sh time false # This should cause the script to exit echo FAILURE true $ ksh -o errexit 1.sh real 0m0.00s user 0m0.00s sys 0m0.00s FAILURE src/cmd/ksh93/sh/xec.c: - When the time keyword runs a command, pass the errexit state flag to the sh_exec call. This state flag is required for ksh to exit when a command fails while the errexit option is on. src/cmd/ksh93/tests/basic.sh: - Add a regression test based on the reproducer.
		
			
				
	
	
		
			1482 lines
		
	
	
	
		
			60 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			1482 lines
		
	
	
	
		
			60 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-11-29:
 | |
| 
 | |
| - A bug that caused the time keyword to override the errexit shell option has
 | |
|   been fixed.
 | |
| 
 | |
| 2021-11-24:
 | |
| 
 | |
| - The --posix mode was amended to stop the '.' command (but not 'source') from
 | |
|   looking up functions defined with the 'function' keyword. In the POSIX
 | |
|   standard and on other shells, the '.' command finds only script files.
 | |
| 
 | |
| - The rm built-in's -d/--directory option has been fixed. It now properly
 | |
|   removes empty directories and refuses to remove non-empty directories
 | |
|   (as specified in https://www.austingroupbugs.net/view.php?id=802). Note
 | |
|   that the rm built-in command isn't compiled in by default.
 | |
| 
 | |
| 2021-11-23:
 | |
| 
 | |
| - A bug was fixed that allowed arithmetic expressions to assign out-of-range
 | |
|   values to variables of an enumeration type defined with the 'enum' command,
 | |
|   causing undefined behavior. Within arithmetic expressions, enumeration
 | |
|   values translate to index numbers from 0 to the number of elements minus 1.
 | |
|   That range is now checked for. Decimal fractions are ignored.
 | |
| 
 | |
| 2021-11-21:
 | |
| 
 | |
| - It is now possible to use types defined by 'enum' in contexts where the
 | |
|   script is entirely parsed before (or without) being executed, such as
 | |
|   dotted/sourced scripts and scripts compiled by shcomp.
 | |
| 
 | |
| - Added support for the size mode to the stty(1) built-in. This mode is used
 | |
|   to display the terminal's number of rows and columns. Note that the stty
 | |
|   built-in is not compiled in by default. This can be changed by adding
 | |
|   stty to the table of built-ins in src/cmd/ksh93/data/builtins.c.
 | |
| 
 | |
| 2021-11-20:
 | |
| 
 | |
| - Listing types with 'typeset -T' no longer displays incomplete versions of
 | |
|   types created by the enum built-in.
 | |
| 
 | |
| 2021-11-18:
 | |
| 
 | |
| - The printf built-in command now supports a -v option as on bash and zsh.
 | |
|   This allows you to assign formatted output directly to a variable.
 | |
| 
 | |
| - Fixed a performance regression introduced on 2021-05-03 that caused
 | |
|   the shbench[*] fibonacci benchmark to run slower.
 | |
|   [*]: https://github.com/ksh-community/shbench
 | |
| 
 | |
| 2021-11-16:
 | |
| 
 | |
| - By default, arithmetic expressions in ksh no longer interpret a number
 | |
|   with a leading zero as octal in any context. Use 8#octalnumber instead.
 | |
|   Before, ksh would arbitrarily recognize the leading octal zero in some
 | |
|   contexts but not others, e.g., both of:
 | |
| 	$ x=010; echo "$((x)), $(($x))"
 | |
| 	$ set -o letoctal; x=010; let y=$x z=010; echo "$y, $z"
 | |
|   would output '10, 8'. These now output '10, 10' and '8, 8', respectively.
 | |
|   Arithmetic expressions now also behave identically within and outside
 | |
|   ((...)) and $((...)). Setting the --posix compliance option turns on the
 | |
|   recognition of the leading octal zero for all arithmetic contexts.
 | |
| 
 | |
| 2021-11-15:
 | |
| 
 | |
| - In arithmetic evaluation, the --posix compliance option now disables the
 | |
|   special floating point constants Inf and NaN so that $((inf)) and $((nan))
 | |
|   refer to the variables by those names as the standard requires. (BUG_ARITHNAN)
 | |
| 
 | |
| - Fixed two file descriptor leaks in the hist builtin that occurred when
 | |
|   the -s flag ran a command or encountered an error.
 | |
| 
 | |
| 2021-11-14:
 | |
| 
 | |
| - Fixed: ksh crashed after unsetting .sh.match and then matching a pattern.
 | |
| 
 | |
| - Another test/[ fix: "test \( string1 -a string2 \)" and "test \( string1 -o
 | |
|   string2 \)" no longer give an incorrect "argument expected" error message.
 | |
| 
 | |
| 2021-11-13:
 | |
| 
 | |
| - The test/[ built-in command now supports the '<' and '=~' operators from [[.
 | |
|   As of now, test/[ supports the same operators as [[ except for the different
 | |
|   and/or operators. Note: test/[ remains deprecated due to its many pitfalls.
 | |
| 
 | |
| - The test/[ built-in command is fixed so that the binary -a (and) and -o (or)
 | |
|   operators, as in [ "$a" -a "$b" ] or [ "$a" -o "$b" ], work even if "$a" is
 | |
|   '!' or '('. To avoid breaking backwards compatibility with the nonstandard
 | |
|   unary [ -a "$file" ] and [ -o "$option" ] operators in combination with '!'
 | |
|   or parentheses, this fix is only activated if the posix option is on.
 | |
| 
 | |
| 2021-11-07:
 | |
| 
 | |
| - Fixed a bug that could corrupt output if standard output is closed upon
 | |
|   initializing the shell.
 | |
| 
 | |
| - Improved BUG_PUTIOERR fix (2020-05-14) with more error checking. On
 | |
|   systems with the "disk full" error testing device /dev/full, an
 | |
|   echo/print/printf to /dev/full now always yields a non-zero exit status.
 | |
| 
 | |
| 2021-09-13:
 | |
| 
 | |
| - Disable the POSIX arithmetic context while running a command substitution
 | |
|   invoked from within an arithmetic expression. This fixes a bug that caused
 | |
|   integer arguments with a leading zero to be incorrectly interpreted as octal
 | |
|   numbers in non-POSIX arithmetic contexts within such command substitutions.
 | |
| 
 | |
| 2021-09-12:
 | |
| 
 | |
| - When invoking a script without an interpreter/hashbang path on Linux and
 | |
|   macOS, ksh can now update 'ps' output to show longer command lines.
 | |
| 
 | |
| 2021-08-13:
 | |
| 
 | |
| - An issue was fixed that could cause old-style `backtick` command
 | |
|   substitutions to hang in certain cases.
 | |
| 
 | |
| 2021-06-03:
 | |
| 
 | |
| - Fixed a bug in the [[ compound command: the '!' logical negation operator
 | |
|   now correctly negates another '!', e.g., [[ ! ! 1 -eq 1 ]] now returns
 | |
|   0/true. Note that this has always been the case for 'test'/'['.
 | |
| 
 | |
| 2021-05-18:
 | |
| 
 | |
| - Fixed SHLVL so that replacing ksh by itself (exec ksh) will not increase it.
 | |
| 
 | |
| - Fixed a regression introduced on 2020-08-05 that caused a non-interactive
 | |
|   shell to exit if an I/O redirection of a function call encountered an error.
 | |
| 
 | |
| 2021-05-13:
 | |
| 
 | |
| - Fixed a bug with 'test -t 1' that was introduced on 2021-04-26:
 | |
|   v=$(test -t 1 >/dev/tty && echo ok) did not assign 'ok' to v.
 | |
| 
 | |
| 2021-05-10:
 | |
| 
 | |
| - Release 1.0.0-beta.1.
 | |
| 
 | |
| 2021-05-07:
 | |
| 
 | |
| - Backported three ksh 93v- math.tab changes, allowing for an exp10()
 | |
|   arithmetic function if one exists in the C library, a new float()
 | |
|   function, and lastly an updated int() function that rounds to zero
 | |
|   instead of being an alias to floor().
 | |
| 
 | |
| 2021-05-05:
 | |
| 
 | |
| - Fixed: a preceding variable assignment like foo=bar in 'foo=bar command'
 | |
|   (with no command arguments after 'command') incorrectly survived the
 | |
|   'command' regular built-in command invocation.
 | |
| 
 | |
| - Fixed: 'command -p some_utility' intermittently failed to find the utility
 | |
|   under certain conditions due to a memory corruption issue.
 | |
| 
 | |
| 2021-05-03:
 | |
| 
 | |
| - Subshells (even if non-forked) now keep a properly separated state of the
 | |
|   pseudorandom generator used for $RANDOM, so that using $RANDOM in a
 | |
|   non-forked subshell no longer influences a reproducible $RANDOM sequence in
 | |
|   the parent environment. In addition, upon invoking a subshell, $RANDOM is now
 | |
|   reseeded (as mksh and bash do).
 | |
| 
 | |
| - Fixed program flow corruption that occurred in scripts on executing a
 | |
|   background job in a nested subshell, as in ( ( simple_command & ) ).
 | |
| 
 | |
| - Completed the 2021-04-30 fix for ${var<OP>'{}'} where <OP> is '-', '+',
 | |
|   ':-' or ':+' by fixing a bug that caused an extra '}' to be output.
 | |
| 
 | |
| - Following the resolution of Austin Group bug 1393[*] that is set to be
 | |
|   included in the next version of the POSIX standard, the 'command' prefix
 | |
|   in POSIX mode (set -o posix) no longer disables the declaration properties
 | |
|   of declaration built-ins. This reverts a change introduced on 2020-09-11.
 | |
|   [*] https://austingroupbugs.net/view.php?id=1393
 | |
| 
 | |
| - Fixed arithmetic assignment operations for multidimensional indexed arrays
 | |
| 
 | |
| 2021-04-30:
 | |
| 
 | |
| - The emacs 'ESC .' (M-.) and vi '_' commands now take shell quoting into
 | |
|   account when repeating a word from the previous command line. For example, if
 | |
|   the previous command is 'ls Stairway\ To\ Heaven.mp3', then they now insert
 | |
|   'Stairway\ To\ Heaven.mp3' instead of 'Heaven.mp3'. Thanks to Govind Kamat.
 | |
| 
 | |
| - Fixed a bug introduced on 2020-09-05 that caused "echo ${var:+'{}'}"
 | |
|   to be misparsed.
 | |
| 
 | |
| - Fixed: the effects of 'builtin', 'exec' and 'ulimit' leaked out of a parent
 | |
|   virtual subshell if run from a ${ shared-state; } command substitution.
 | |
| 
 | |
| 2021-04-26:
 | |
| 
 | |
| - Fixed a bug introduced on 2021-02-20 in which a shared-state command
 | |
|   substitution stopped sharing its state with the calling shell environment
 | |
|   if it executed a command that locally redirected standard outpuut.
 | |
| 
 | |
| 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:
 | |
| 
 | |
| - 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
 |