strange shell behavior...thoughts?

Kevin Martin kevintm at ameritech.net
Mon Sep 15 14:35:50 UTC 2008



Cameron Simpson wrote:
> On 14Sep2008 23:50, Kevin Martin <kevintm at ameritech.net> wrote:
> | So I'm fairly confused at this point.
> | 
> | Start with a /bin/sh shell.
> | 
> | Then do:
> | 
> | sh-3.2$ unset $?
> | sh: unset: `0': not a valid identifier
> | 
> | ok, no problem; then do
> | 
> | sh-3.2$ /bin/ksh -c " set -xv  ; grep ABCD  b ; echo $? ; if [ "$?" =
> | "0" ] ; then echo yes ; fi"
>
> You know you need to escape " inside ", yes? As it happens it has no
> effect in your script here, but ...
>
> | + grep ABCD b
> | ABCD="C" ; export ABCD
> | + echo 1
> | 1
> | + [ 1 = 0 ]
> | 
> | WHAT? 
>
> The "echo" command has a return status, and trashes your $?.
>
> | Then do it again without unsetting $?:
>
> You don't ever unset $?. It is not a meaningful idea.
>
> If you want a particular $?, do this:
>
>   grep ABCD b
>   xit=$?
>   echo $xit     # overwrites $?, but $xit is untouched
>   if [ $xit = 0 ]
>   then
>    ...
>
> but almost invariably when someone does:
>
>   some_command ...
>   if [ $? = 0 ]
>   then
>
> they would be MUCH better off just going:
>
>   if some_command ...
>   then
>
> Remember that the predicate in an if/while if a command_list, and the
> exit status of the last command in the command_list is what is tested.
> The command "[" (aka "test") is just another command suited to simple
> Boolean tests. But it is not "special".
>
> Example:
>
>   # repeat prompt until EOF or empty reply
>   while echo "Enter something:"
>         read foo && [ -n "$foo" ]
>   do
>     echo "foo=$foo"
>   done
>
> | [...snip...] Is this a ksh bug?
>
> No.
>
> Cheers,
>   

Uh, yeah, duh on my part on the "unset $?" stupidity.  I was trying to
duplicate what I'm seeing in our application.  Essentially we have an
application that can run remote commands on a schedule (kind of like a
network scron) and it basicly execs a "/bin/sh" and runs whatever
command you've passed it.  What I've been seeing is if I try to pass the
"/bin/ksh -c "if...."" script the $? of the grep never seems to be 0 for
some reason so I essentially get the results that I showed in my example
where I was doing the dumb "unset $?" (making, at that point, $? = 1). 
I agree that the "if some_command" would be a much better way of doing
this but I get the same results if I do that as I do if I do the
"some_command" the "if [ $? = 0 ]" test.  From reading the man page for
ksh I may be running into a POSIX vs non-POSIX issue.

Kevin




More information about the fedora-list mailing list