mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-13 11:42:21 +00:00
Standard output (FD 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. ksh -c 'v=$(echo begincomsub [ -t 1 ] && echo oops echo endcomsub) echo "$v"' This should not output "oops". This is one of the many bugs with ksh93 virtual (non-forked) subshells. On the abandoned Vashist/Rader ksh2020 branch, this bug was fixed by changing quite a lot of code, which introduced and/or exposed another bug: https://github.com/att/ast/issues/1079 https://github.com/att/ast/commit/8e1e405e https://github.com/att/ast/issues/1088 That issue was unresolved when the ksh2020 branch was abandoned. The safer and more conservative fix is simply forcing the subshell to fork if we're in a non-forked command substitution and testing '-t 1'. It is hard to imagine a situation where this would cause a noticable performance hit. Note that this fix does not affect ksh93-specific "shared" non-subshell ${ command substitutions; } which are executed in the main shell environment, so that variables survive, etcetera. 'test -t 1' continues to wrongly return true there, but command substitutions of that form cannot be forked because that would defeat their purpose. src/cmd/ksh93/bltins/test.c: - Fix 'test -t 1', '[ -t 1 ]' and '[[ -t 1 ]]' by forking the current subshell if it is a virtual/non-forked subshell (shp->subshell), and a command substitution (shp->comsub), but NOT a "shared" ${ command substitution; } (!shp->subshare). src/cmd/ksh93/tests/bracket.sh: - Add two regression tests for this issue, which were adapted from the Vashist/Rader ksh2020 branch. NEWS, src/cmd/ksh93/include/version.h: - Update. (cherry picked from commit b8ef05e457ead65b83417699b8dd8632f855e2fa)
62 lines
2.6 KiB
Text
62 lines
2.6 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/modernish/ksh
|
|
|
|
Any uppercase BUG_* names are modernish shell bug IDs.
|
|
|
|
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 and report
|
|
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
|