bothe@net7.uucp (11/15/90)
in sh, case does not save vars correct (i think)
such a script shtest:
#==== start script shtest =====
echo "1=$1, 2=$2, #=$#"
case $1 in
-d)
shift
echo "1=$1, 2=$2, #=$#"
b="$1 x"
echo ++++++++++++++++ $b
esac |
cat
echo ++++++++++++++++ $b
echo "1=$1, 2=$2, #=$#"
#==== end script shtest =====
called with:
shtest -d affe
results: | remarks:
_________________________ | _____________________
1=-d, 2=affe, #=2 | orig params, ok
1=affe, 2=, #=1 | ok, params shifted
++++++++++++++++ affe x | ok
++++++++++++++++ | oops, where is content of b ?
1=-d, 2=affe, #=2 | hey, hu, what is going on with shift ?
i did expect only 1 parameter ($1=affe) after esac, and var b set as
in case !
is it a bug or a feature
if i don't pipe esac and not use cat, all is ok, but i want to pipe !
what to do ?
S I E M E N S Richard Bothe, NIXDORF COMPUTER AG, Dep PDT-M 24
------------- Berliner Str. 95, W-8000 Munic (West Germany)
N I X D O R F Tel.: +49 89 3601 2956, USA: bothe.muc@nixdorf.com
(SNI) !USA: bothe.muc@nixdorf.de, NERV: bothe.muccpcahil@virtech.uucp (Conor P. Cahill) (11/15/90)
In article <1236@netmuc.UUCP> bothe@net7.uucp writes: >#==== start script shtest ===== >case $1 in >esac | >cat >echo ++++++++++++++++ $b The problem is any processing run in a sub-shell will not effect the variables in the parent shell. Because you use a pipe, the shell must run a sub-shell to handle the case portion of the pipeline. >if i don't pipe esac and not use cat, all is ok, but i want to pipe ! Work out some other mechanism to get your desired results. -- Conor P. Cahill (703)430-9247 Virtual Technologies, Inc., uunet!virtech!cpcahil 46030 Manekin Plaza, Suite 160 Sterling, VA 22170
news@usenet.ins.cwru.edu (11/15/90)
In article <1236@netmuc.UUCP> bothe@net7.uucp writes: >if i don't pipe esac and not use cat, all is ok, but i want to pipe ! In the immortal words of Guy Harris (or is that the words of the immortal Guy Harris? :-): ``You've been zapped by Mr. Subshell'' Sh runs control structures with pipes in a subshell. Variables set in a subshell cannot affect the parent's settings. Chet -- Chet Ramey ``I die, Horatio'' Network Services Group, Case Western Reserve University chet@ins.CWRU.Edu My opinions are just those, and mine alone.
rdavis@connie.UUCP (Ray Davis) (11/16/90)
In <1990Nov15.155604.16714@usenet.ins.cwru.edu> news@usenet.ins.cwru.edu writes: >>if i don't pipe esac and not use cat, all is ok, but i want to pipe ! >Sh runs control structures with pipes in a subshell. Variables set in a >subshell cannot affect the parent's settings. It isn't the control structure that is the problem, it's the pipe. Note that in ksh (and maybe SVR? sh), the pipe causes a subshell, but redirecting the output of the case to a file does not. Note also that if you 'cat | case', the case is not in a subshell. Ray --- Ray Davis Convex Computer GmbH, Frankfurt, West Germany unido!connie!rdavis, uunet!convex!rdavis, rdavis@convex.com, +49-69-666-8081
andyc@bucky.intel.com (Andy Crump) (11/30/90)
>>>>> On 15 Nov 90 19:05:53 GMT, rdavis@connie.UUCP (Ray Davis) said: Ray> In <1990Nov15.155604.16714@usenet.ins.cwru.edu> news@usenet.ins.cwru.edu writes: >>if i don't pipe esac and not use cat, all is ok, but i want to pipe ! >Sh runs control structures with pipes in a subshell. Variables set in a >subshell cannot affect the parent's settings. Ray> It isn't the control structure that is the problem, it's the Ray> pipe. Note that in ksh (and maybe SVR? sh), the pipe causes a Ray> subshell, but redirecting the output of the case to a file does Ray> not. Note also that if you 'cat | case', the case is not in a Ray> subshell. I tried this on Intel SVR4 version 2.0 with both ksh and sh and they behave exactly as everyone describes. The pipe causes a subshell. You have been zapped by Mr. SubShell. -- -- Andy Crump ...!tektronix!reed!littlei!andyc | andyc@littlei.intel.com ...!uunet!littlei!andyc | andyc@littlei.uu.net Disclaimer: Any opinions expressed here are my own and not representive of Intel Corportation.