Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 May 2013 19:59:59 +0200
From:      rank1seeker@gmail.com
To:        "Jilles Tjoelker" <jilles@stack.nl>, hackers@freebsd.org
Subject:   Re: /bin/sh => STDIN & functions, var scope messing
Message-ID:  <20130531.175959.745.2@DOMY-PC>
In-Reply-To: <20130530223031.GA1672@stack.nl>
References:  <20130527.194235.693.1@DOMY-PC> <CA%2B0MdpOcz7aw03HCrbxZVt1cnWdR4shqWaEfBrQkCpPnbgXLPQ@mail.gmail.com> <CAKw7uVjty2cJXT_QmexxKdRQyiKoHYMK1E-TjSHa5TCX1S8Bbg@mail.gmail.com> <20130530223031.GA1672@stack.nl>

next in thread | previous in thread | raw e-mail | index | archive | help
Redirections > and >> don't put it in a subshell.=0D=0AOnly pipe |, which =
means only STDIN affects/triggers this behaviour.=0D=0ADoes < operator =
also does it, as it is also STDIN?=0D=0A=0D=0AAnyway, I don't care for =
executing binaries, but I do care if that is part of sh's code, as =
function is.=0D=0AIt messes var scopes.=0D=0A=0D=0AAnd finally if we take =
into account this:=0D=0A=0D=0A> For example=85 in pc-sysinstall=85=0D=0A> =
=0D=0A> ./backend/functions-extractimage.sh-      tar cvf - . 2>/dev/null =
| tar -xpv -C ${FSMNT} ${TAROPTS} -f - 2>&1 | tee -a =
${FSMNT}/.tar-extract.log=0D=0A> ./backend/functions-extractimage.sh:     =
 if [ $? -ne 0 ]=0D=0A> =0D=0A> That's a big no-no.=0D=0A> =0D=0A> If =
your first tar (the initial lvalue to the first pipe) fails=85 but your =
second tar succeeds (rvalue to the first pipe)=85 you won't catch that =
failure in your checking of $?=0D=0A> =0D=0A> Also, if the first tar =
succeeds, but the second tar fails, AND the final rvalue (the tee) =
succeeds=85 you also miss the error code.=0D=0A> =0D=0A> I call this the =
"piped return-status conflation issue". Basically=85 anytime you want to =
check the return-status in shell=85 and you care about lvalue-failures in =
a pipe-chain=85 you must rewrite it to either:=0D=0A> =0D=0A> (a) be =
aware of the problem (I've in the past written wrappers that will test =
the previous return status and abort the chain in such an event)=0D=0A> =
=0D=0A> (b) undo the pipe-chain and store your results for incremental =
processing=85 checking the return status after each filter.=0D=0A> =
=0D=0A> -- =0D=0A> Devin=0D=0A=0D=0A=0D=0Ash's behaviour must be changed =
regarding pipeing=0D=0A=0D=0A> > Curious. Which of the two behaviours is =
POSIXly correct?=0D=0A> =0D=0A> Both. As per XCU 2.12 Shell Execution =
Environment, each command in a=0D=0A> multi-command pipeline may or may =
not be executed in a subshell=0D=0A> environment.=0D=0A> =0D=0A> =
Behaviour different from our sh is most often encountered in the =
various=0D=0A> versions of the real Korn shell (ksh88 and ksh93), which =
execute the=0D=0A> last command in a pipeline in the current shell =
environment.=0D=0A> =0D=0A> If things like  jobs | cat  work, that can =
also be explained using this=0D=0A> rule.=0D=0A> =0D=0A> -- =0D=0A> =
Jilles Tjoelker=0D=0A>=0D=0A=0D=0A=0D=0ADomagoj Smol=E8i=E6=0D=0A



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130531.175959.745.2>