sh: Exempt $@ and $* from set -u

This seems more useful and will likely be in the next POSIX standard.

Also document more precisely in the man page what set -u does (note that
$@, $* and $! are the only special parameters that can ever be unset, all
the others are always set, although they may be empty).
This commit is contained in:
Jilles Tjoelker 2009-10-24 21:20:04 +00:00
parent 941538c0f4
commit 64254a667a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=198454
3 changed files with 18 additions and 3 deletions

View File

@ -657,7 +657,7 @@ again: /* jump here after setting a variable with ${var=text} */
}
varlen = 0;
startloc = expdest - stackblock();
if (!set && uflag) {
if (!set && uflag && *var != '@' && *var != '*') {
switch (subtype) {
case VSNORMAL:
case VSTRIMLEFT:

View File

@ -32,7 +32,7 @@
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $FreeBSD$
.\"
.Dd May 31, 2009
.Dd October 24, 2009
.Dt SH 1
.Os
.Sh NAME
@ -296,7 +296,10 @@ sh -T -c "trap 'exit 1' 2 ; some-blocking-program"
.Ed
.It Fl u Li nounset
Write a message to standard error when attempting
to expand a variable that is not set, and if the
to expand a variable, a positional parameter or
the special parameter
.Va \&!
that is not set, and if the
shell is not interactive, exit immediately.
.It Fl V Li vi
Enable the built-in

View File

@ -0,0 +1,12 @@
# $FreeBSD$
set -u
: $* $@ "$@" "$*"
set -- x
: $* $@ "$@" "$*"
shift $#
: $* $@ "$@" "$*"
set -- y
set --
: $* $@ "$@" "$*"
exit 0