[gnu.bash.bug] More :${abc?abc} exits

barratt@DASH.MITRE.ORG (Jeff Barratt) (01/06/90)

Brian,
	With regard to John Ramsdell's question about parameter
expansion:  The syntax
	${param:?[value]}
is supposed to substitute "param" if it is not null, otherwise it
should write "value" to stderr.  If value is omitted, then sh writes
	param: parameter null or not set

This is paraphrased from UNIX Shell Programming, by Kochan and Wood.
As you can see from the transcript below, sh will also accept
${param?[val]} (e.g. without the internal ":").  sh only writes the
"value" string if the variable "param" is not set.  If the variable is
set, sh attempts to execute the contents of param as a command.

Script started on Fri Jan  5 14:41:09 1990
bash$ sh
$ set
ARCH=sun3
BASH=/bin/sh
..
..many other variables...
..
$ echo $abc

$ ${abc?}
abc: parameter null or not set
$ ${abc:?}
abc: parameter null or not set
$ ${abc?"What a crock"}
abc: What a crock
$ ${abc?ls}
abc: ls
$ abc=
$ ${abc?}
$ ${abc?ls}
$ abc=zip
$ ${abc:?}
zip: not found
$ ${abc:?"What a crock, II"}
zip: not found
$ : ${abc:?}
$ : ${abc:?"What now?"}
$ exit

script done on Fri Jan  5 14:43:23 1990

Bash, on the other hand, doesn't seem to handle this.  If abc is not
set, the syntax
	${abc:?}
will exit the shell, and 
	${abc:?"Help"} will echo Help and *then* exit the shell.  In
neither case should bash exit the current shell.  If abc=ls, then bash
behaves correctly, e.g. executes ls, and remains in the current shell.

I verified this behavior in both 1.03 and 1.04 on a Sun-3 running
SunOS 4.0.3

Thanks, 
Jeff Barratt

chet@cwns1.CWRU.EDU (Chet Ramey) (01/09/90)

In article <9001052019.AA01516@dash.mitre.org> barratt@dash.mitre.org writes:

>Brian,
>	With regard to John Ramsdell's question about parameter
>expansion:  The syntax
>	${param:?[value]}
>is supposed to substitute "param" if it is not null, otherwise it
>should write "value" to stderr.  If value is omitted, then sh writes
>	param: parameter null or not set

It does this when the shell is interactive.  When the shell is not interactive,
it exits.  The POSIX spec said nothing about interactive vs non-interactive
behavior (neither does the sh man page, as a matter of fact), so Brian 
just exited the shell after a bad substitution like that.  I `fixed' it to
mimic the sh behavior (`do what I do, not what I say'), and that's the 
code Brian is running now.

This is the full description from the System V sh manual:

${parameter:?word}

"If `parameter' is set and is non-null, substitute its value; otherwise, print
 `word' and exit from the shell.  If `word' is omitted, the message `parameter
 null or not set' is printed."

Chet Ramey
-- 
Chet Ramey
Network Services Group				"Help! Help! I'm being
Case Western Reserve University			 repressed!"
chet@ins.CWRU.Edu			

barratt@DASH.MITRE.ORG (Jeff Barratt) (01/11/90)

Thanks for the clarification, Chet.  In fact, the book I mentioned,
"UNIX Shell Programming" by Kochan and Wood, does mention that sh
won't exit a "login shell".  I don't have the system V documentation.
The problem was only noticed because I was trying to understand the
syntax of the parameter expansions interactively---I don't know
whether the sh behavior has any practical virtue, other than maybe the
general principle that interactive shells should only exit if asked
to.  So, I guess that I agree with fixing bash to emulate sh in this
case.

Jeff Barratt
----------------------
barratt@dash.mitre.org

I will not be pushed, filed,
stamped, indexed, briefed,
debriefed or numbered.
	- The Prisoner