mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-02-15 04:32:24 +00:00
This fixes three related bugs: 1. 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. (BUG_ISSETLOOP) 2. ${IFS+s} always yielded 's', and [[ -v IFS ]] always yielded true, even if IFS is unset. (BUG_IFSISSET) 3. IFS was incorrectly exempt from '-u' ('-o nounset') checks. src/cmd/ksh93/sh/macro.c: varsub(): - When getting a node pointer (np) to the parameter to test, special-case IFS by checking if it has a value and not setting the pointer if not. The node to IFS always exists, even after 'unset -v IFS', so before this fix it always followed the code path for a parameter that is set. This fixes BUG_IFSISSET for ${IFS+s} and also fixes set -u (-o nounset) with IFS. - Before using the 'nv_isnull' macro to check if a regular variable is set, call nv_optimize() if needed. This fixes BUG_ISSETLOOP. Idea from Kurtis Rader: https://github.com/att/ast/issues/1090 Of course this only works if SHOPT_OPTIMIZE==1 (the default), but if not, then this bug is not triggered in the first place. - Add some comments for future reference. src/cmd/ksh93/bltins/test.c: test_unop(): - Fix BUG_IFSISSET for [[ -v IFS ]]. The nv_optimize() method doesn't seem to have any effect here, so the only way that I can figure out is to special-case IFS, nv_getval()'ing it to check if IFS has a value in the current scope. src/cmd/ksh93/tests/variables.sh: - Add regression tests for checking if a varariable is set within a loop, within and outside a function with that variable made local (to check if the scope is honoured). Repeat these tests for a regular variable and for IFS, for ${foo+set} and [[ -v foo ]]. (cherry picked from commit a2cf79cb98fa3e47eca85d9049d1d831636c9b16)
87 lines
4.2 KiB
Text
87 lines
4.2 KiB
Text
TODO for AT&T ksh93, 93u+m bugfix branch
|
||
|
||
______
|
||
Fix or remove broken default aliases:
|
||
|
||
- Remove alias times='{ { time;} 2>&1;}' which does not produce POSIX-
|
||
compliant output; reimplement as a proper POSIX-compliant builtin.
|
||
In any case, implementing a standard utility as an alias is unacceptable
|
||
as 'unalias -a' (remove all aliases) should not remove standard utilities!
|
||
Backport the builtin from the abandoned Vashisht/Rader branch:
|
||
https://github.com/att/ast/pull/1332
|
||
|
||
- Remove alias command='command '. Continuing alias substitution after
|
||
'command' (due to the final space in the alias) is inherently broken, as
|
||
aliases may contain arbitrary shell grammar. For instance, when combining
|
||
this default alias with the default 'times' alias ('command times'), which
|
||
is perfectly valid per POSIX, you get a syntax error!
|
||
|
||
- Remove alias nohup='nohup '. Same reason as for 'command ' above.
|
||
|
||
- Remove pointless default aliases 'fc' and 'type'; these are already
|
||
implemented as normal shell builtins. Add man page entries for these.
|
||
|
||
______
|
||
Fix currently known bugs affecting shell scripting. These are identified by
|
||
their modernish IDs. For exact details, see code/comments in:
|
||
https://github.com/modernish/modernish/tree/0.16/lib/modernish/cap/
|
||
|
||
- BUG_BRACQUOT: shell quoting within bracket patterns has no effect. This
|
||
bug means the '-' retains it special meaning of 'character range', and an
|
||
initial ! (and, on some shells, ^) retains the meaning of negation, even
|
||
in quoted strings within bracket patterns, including quoted variables.
|
||
|
||
- BUG_CMDEXPAN: if the 'command' command results from an expansion, it acts
|
||
like 'command -v', showing the path of the command instead of executing it.
|
||
For example:
|
||
v=command; "$v" ls
|
||
or
|
||
set -- command ls; "$@"
|
||
don't work.
|
||
|
||
- BUG_CMDSPASGN: preceding a "special builtin"[*] with 'command' does not
|
||
stop preceding invocation-local variable assignments from becoming global.
|
||
[*] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14
|
||
|
||
- BUG_CMDSPEXIT: preceding a "special builtin"[*] (other than 'eval', 'exec',
|
||
'return' or 'exit') with 'command' does not always stop it from exiting
|
||
the shell if the builtin encounters error.
|
||
[*] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_14
|
||
|
||
- BUG_CSUBSTDO: If standard output (file descriptor 1) is closed before
|
||
entering a $(command substitution), and any other file descriptors are
|
||
redirected within the command substitution, commands such as 'echo' will
|
||
not work within the command substitution, acting as if standard output is
|
||
still closed.
|
||
|
||
- BUG_FNSUBSH: Function definitions within subshells (including command
|
||
substitutions) are ignored if a function by the same name exists in the
|
||
main shell, so the wrong function is executed. 'unset -f' is also silently
|
||
ignored. This only applies to non-forked subshells.
|
||
|
||
- BUG_IFSGLOBS: In glob pattern matching (as in case or parameter
|
||
substitution with # and %), if IFS starts with ? or * and the "$*"
|
||
parameter expansion inserts any IFS separator characters, those characters
|
||
are erroneously interpreted as wildcards when quoted "$*" is used as the
|
||
glob pattern.
|
||
|
||
- BUG_KUNSETIFS: ksh93: Can't unset IFS under very specific circumstances.
|
||
unset -v IFS is a known POSIX shell idiom to activate default field
|
||
splitting. With this bug, the unset builtin silently fails to unset IFS
|
||
(i.e. fails to activate field splitting) if we're executing an eval or a
|
||
trap and a number of specific conditions are met.
|
||
|
||
- BUG_LOOPRET2: If a 'return' command is given without a status argument
|
||
within the set of conditional commands in a 'while' or 'until' loop (i.e.,
|
||
between 'while'/'until' and 'do'), the exit status passed down from the
|
||
previous command is ignored and the function returns with status 0
|
||
instead.
|
||
|
||
- BUG_MULTIBIFS: We're on a UTF-8 locale and the shell supports UTF-8
|
||
characters in general (i.e. we don't have WRN_MULTIBYTE) – however, using
|
||
multi-byte characters as IFS field delimiters still doesn't work. For
|
||
example, "$*" joins positional parameters on the first byte of IFS instead
|
||
of the first character.
|
||
|
||
- BUG_TESTERR1A: test/[ exits with a non-error false status (1) if an
|
||
invalid argument is given to an operator.
|