1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

POSIX: 'command': don't disable declaration proprts (re: b9d10c5a)

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.
[*] https://austingroupbugs.net/view.php?id=1393

src/cmd/ksh93/sh/parse.c: lex():
- Skip the 'command' prefix even in POSIX mode so that any
  declaration commands prefixed by it are treated as such in xec.c
  (sh_exec()).

src/cmd/ksh93/sh/xec.c: sh_exec():
- The foregoing change reintroduced a variant of BUG_CMDSPEXIT: the
  shell exits on something like 'command export readonlyvar=foo'.
  This now fixes that bug for both POSIX and non-POSIX mode. When
  calling nv_setlist() to process true shell assignments, and there
  is a 'command' prefix, push a shell context and use sigsetjmp to
  intercept any errors in assignments and stop the shell exiting.

src/cmd/ksh93/tests/builtins.sh:
- Borrow the BUG_CMDSPEXIT regression test from modernish and adapt
  it for ksh. (I'm the author so yes, I can do this.) Original:
  ae8fe9c3/lib/modernish/tst/builtin.t (L80-L109)
This commit is contained in:
Martijn Dekker 2021-05-04 00:34:06 +01:00
parent 1a1e3709c2
commit d309d604e7
5 changed files with 50 additions and 12 deletions

View file

@ -1241,5 +1241,30 @@ got=$("$SHELL" -c 'cd /; echo "$OLDPWD"' 2>&1)
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
cd "$tmp"
# ======
# BUG_CMDSPEXIT
exp='ok1ok2ok3ok4ok5ok6ok7ok8ok9ok10ok11ok12end'
got=$( readonly v=foo
exec 2>/dev/null
# All the "special builtins" below should fail, and not exit, so 'print end' is reached.
# Ref.: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html
# Left out are 'command exec /dev/null/nonexistent', where no shell follows the standard,
# as well as 'command exit' and 'command return', because, well, obviously.
command : </dev/null/no || print -n ok1
command . /dev/null/no || print -n ok2
command set +o bad@option || print -n ok3
command shift $(($# + 1)) || print -n ok4
(unalias times; PATH=/dev/null; eval 'command times foo bar >/dev/null || print -n ok5')
command trap foo bar baz quux || print -n ok6
command unset v || print -n ok7
command eval "(" || print -n ok8
command export v=baz || print -n ok9
command readonly v=bar || print -n ok10
command break && print -n ok11 # 'break' and 'continue' are POSIXly allowed to quietly...
command continue && print -n ok12 # ..."succeed" if they are used outside of a loop :-/
print end)
[[ $got == "$exp" ]] || err_exit "prefixing special builtin with 'command' does not stop it from exiting the shell on error" \
"(expected $(printf %q "$exp"), got $(printf %q "$got"))"
# ======
exit $((Errors<125?Errors:125))