Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > gnu.bash.bug > #11626

Re: command substitution is stripping set -e from options

Path csiph.com!xmission!news.glorb.com!usenet.stanford.edu!not-for-mail
From Linda Walsh <bash@tlinx.org>
Newsgroups gnu.bash.bug
Subject Re: command substitution is stripping set -e from options
Date Mon, 12 Oct 2015 09:10:33 -0700
Lines 86
Approved bug-bash@gnu.org
Message-ID <mailman.153.1444666271.7904.bug-bash@gnu.org> (permalink)
References <CADex794C1jOf0wrB298_O4ohAqZghYUdd9DJcuaOvV1dCP5AOQ@mail.gmail.com> <560D83DA.9020405@redhat.com> <CADex795r=oqZ7iv4TxrjUn9coDUnu=PgPngkfRWA1f7EZyohfA@mail.gmail.com> <20151002122925.GK25574@eeg.ccf.org> <CADex797-gWHRzpy=gsdORZtU=Os5Qe6f=LwJ7xJ-N-6oHZdd3w@mail.gmail.com> <20151002132221.GL25574@eeg.ccf.org> <56103208.30406@case.edu>
NNTP-Posting-Host lists.gnu.org
Mime-Version 1.0
Content-Type text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding 7bit
X-Trace usenet.stanford.edu 1444666271 15850 208.118.235.17 (12 Oct 2015 16:11:11 GMT)
X-Complaints-To action@cs.stanford.edu
Cc Greg Wooledge <wooledg@eeg.ccf.org>, Christoph Gysin <christoph.gysin@gmail.com>, bug-bash@gnu.org
To chet.ramey@case.edu
Envelope-to bug-bash@gnu.org
User-Agent Thunderbird
In-Reply-To <56103208.30406@case.edu>
X-detected-operating-system by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic]
X-Received-From 173.164.175.65
X-BeenThere bug-bash@gnu.org
X-Mailman-Version 2.1.14
Precedence list
List-Id Bug reports for the GNU Bourne Again SHell <bug-bash.gnu.org>
List-Unsubscribe <https://lists.gnu.org/mailman/options/bug-bash>, <mailto:bug-bash-request@gnu.org?subject=unsubscribe>
List-Archive <http://lists.gnu.org/archive/html/bug-bash>
List-Post <mailto:bug-bash@gnu.org>
List-Help <mailto:bug-bash-request@gnu.org?subject=help>
List-Subscribe <https://lists.gnu.org/mailman/listinfo/bug-bash>, <mailto:bug-bash-request@gnu.org?subject=subscribe>
Xref csiph.com gnu.bash.bug:11626

Show key headers only | View raw



Chet Ramey wrote:
> On 10/2/15 9:22 AM, Greg Wooledge wrote:
>> On Fri, Oct 02, 2015 at 03:53:42PM +0300, Christoph Gysin wrote:
>>> I'm still curious as to why set -e is stripped in the first place?
>> Chet can give the definitive answer, but my take is that it's a huge
>> surprise to someone writing a function independent of the script, or
>> using a function that was written independently of the script.
---
	It used to not be so surprising before the action of set -e was
changed to signal fail on non-simple commands returning non-zero return
codes.  Set -e used to be useful -- mostly during devel, but even in 
some "working" software to catch errors where the developer wasn't expecting
a fail from some command.

Having to write failure code for everything made set-e useless.
A self-fulfilling truth, at the time, for those who argued that set-e
was useless the way it previously functioned, so anything that changes
its behavior should be considered a 'no-op', because it was already
broken (for them).  No one seemed to get the circular reasoning
in use there.

Before, auto-err-exit only happened on on **simple** (external) commands, 
but now builtins, like ((a=0));echo $? will trigger a exception with the
((a=0)) (because in calculations, a value of 0 is the only 'true' 
value.  That was probably one of the more stupid effects of the
new set-e changes -- that bash in non-posix mode should emulate
the posix behavior and throw a errexit if a lone calculation yields 0, and
made bash up to 22x slower on some numeric calcs

0) null case (no calculation)
> time (i=1000000 && while((--i));do : ; done)       
3.84sec 3.84usr 0.00sys (100.03% cpu)

1) simple calc, pre set-e change:
> time (i=1000000 && while((--i));do ((a=0)); done)
3.92sec 3.91usr 0.00sys (100.01% cpu)

simple calc - null case (removing loop costs) = .08s/1M-loops 

2) using post set-o posix approved syntax:

> time (i=1000000 && while((--i));do let a=0 ; done)        
5.72sec 5.72usr 0.00sys (100.01% cpu)

Posix pushed change in set-e case (minus null loop) = 1.88s/1M-loop
or 22.5X the simple case.



> It's been over 20 years, and we weren't as detailed with our change logs
> back then, but I imagine the rationale was similar to the above with the
> addition of something like the following:
> 
> The parent shell (the one that enabled -e) should be the one to make the
> decision about whether or not the shell exits.  The exit status of the
> command substitution doesn't make a difference except in one special case,
> so inheriting errexit and exiting (possibly prematurely) doesn't really
> help the parent decide whether or not to exit.
---
	Wasn't it still the case that an error in the function:
could be caught in the parent by something like:

    funcall || { stat=$?; possible_altfunc or die $stat "msg" ;}  
---

> 
> Now, of course, it's been more than 20 years, and backwards compatiblity
> is a concern.
---
	It wasn't so much, when set-e was changed only a few years ago. ;-/

Besides, what would be wrong with a env BASH_SETFLAG_MASK that could mask out 
set values that would auto-change in a function (or some similar mechanism).
I had to write some workaround code to support '-x' staying on in functions, 
as well as having the effect of localizing any '-x' change to the function.
(i.e. at beginning of function, restore global value of -x, at end of function
restore previous global value again)

Usually -- if I was tracing, I wanted to step into most functions, but
I didn't want a function turning on tracing being propagated to the rest
of the prog.

-l

Back to gnu.bash.bug | Previous | Next | Find similar


Thread

Re: command substitution is stripping set -e from options Linda Walsh <bash@tlinx.org> - 2015-10-12 09:10 -0700

csiph-web