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.

Only pipe |, which means only STDIN affects/triggers this behaviour.

Does < operator also does it, as it is also STDIN?



Anyway, I don't care for executing binaries, but I do care if that is part of sh's code, as function is.

It messes var scopes.



And finally if we take into account this:



> For example… in pc-sysinstall…

> 

> ./backend/functions-extractimage.sh-      tar cvf - . 2>/dev/null | tar -xpv -C ${FSMNT} ${TAROPTS} -f - 2>&1 | tee -a ${FSMNT}/.tar-extract.log

> ./backend/functions-extractimage.sh:      if [ $? -ne 0 ]

> 

> That's a big no-no.

> 

> If your first tar (the initial lvalue to the first pipe) fails… but your second tar succeeds (rvalue to the first pipe)… you won't catch that failure in your checking of $?

> 

> Also, if the first tar succeeds, but the second tar fails, AND the final rvalue (the tee) succeeds… you also miss the error code.

> 

> I call this the "piped return-status conflation issue". Basically… anytime you want to check the return-status in shell… and you care about lvalue-failures in a pipe-chain… you must rewrite it to either:

> 

> (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)

> 

> (b) undo the pipe-chain and store your results for incremental processing… checking the return status after each filter.

> 

> -- 

> Devin





sh's behaviour must be changed regarding pipeing



> > Curious. Which of the two behaviours is POSIXly correct?

> 

> Both. As per XCU 2.12 Shell Execution Environment, each command in a

> multi-command pipeline may or may not be executed in a subshell

> environment.

> 

> Behaviour different from our sh is most often encountered in the various

> versions of the real Korn shell (ksh88 and ksh93), which execute the

> last command in a pipeline in the current shell environment.

> 

> If things like  jobs | cat  work, that can also be explained using this

> rule.

> 

> -- 

> Jilles Tjoelker

>





Domagoj Smolčić





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