* set -e (no && or ||)
@ 2012-10-12 11:05 Sergey Fadeev
2012-10-12 11:53 ` Peter Stephenson
0 siblings, 1 reply; 4+ messages in thread
From: Sergey Fadeev @ 2012-10-12 11:05 UTC (permalink / raw)
To: zsh-workers
[-- Attachment #1: Type: text/plain, Size: 333 bytes --]
Why doesn't it exit the shell?
$ set -e
$ echo $(false)
Shouldn't the error code of $(false) command substitution be checked by set -e before passing stdout to the echo builtin?
Isn't it the most logical behavior that most people would expect of set -e?
Zsh version: zsh 4.3.17 (x86_64-redhat-linux-gnu) (if it matters)
Thanks
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: set -e (no && or ||)
2012-10-12 11:05 set -e (no && or ||) Sergey Fadeev
@ 2012-10-12 11:53 ` Peter Stephenson
2012-10-12 13:29 ` Bart Schaefer
2012-10-12 13:49 ` Chet Ramey
0 siblings, 2 replies; 4+ messages in thread
From: Peter Stephenson @ 2012-10-12 11:53 UTC (permalink / raw)
To: zsh-workers
On Fri, 12 Oct 2012 07:05:41 -0400
Sergey Fadeev <hindsight@email.com> wrote:
> Why doesn't it exit the shell?
> $ set -e
> $ echo $(false)
> Shouldn't the error code of $(false) command substitution be checked
> by set -e before passing stdout to the echo builtin?
No, because the command was "echo", and that didn't fail. Exit status
effectively means exit status seen by the main shell command
interpreter ($?), although I'm sure there are some subtleties I haven't
thought about.
The way to get the status of a substitution to fail is to use an
assignment:
output=$(false)
which does cause the shell to exit on failure, because it would set $? to
1. This is standard shell behaviour, though I can't point to where in
the standard it says.
pws
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: set -e (no && or ||)
2012-10-12 11:53 ` Peter Stephenson
@ 2012-10-12 13:29 ` Bart Schaefer
2012-10-12 13:49 ` Chet Ramey
1 sibling, 0 replies; 4+ messages in thread
From: Bart Schaefer @ 2012-10-12 13:29 UTC (permalink / raw)
To: zsh-workers
On Oct 12, 12:53pm, Peter Stephenson wrote:
} Subject: Re: set -e (no && or ||)
}
} On Fri, 12 Oct 2012 07:05:41 -0400
} Sergey Fadeev <hindsight@email.com> wrote:
}
} > Why doesn't it exit the shell?
} > $ set -e
} > $ echo $(false)
} > Shouldn't the error code of $(false) command substitution be checked
} > by set -e before passing stdout to the echo builtin?
}
} No, because the command was "echo", and that didn't fail.
The idea being that not every nonzero status is an error, and -e means
to exit on error.
For example, you generally don't want the shell to exit on something
like this:
while read line
then echo This should eventually stop
fi
echo But you probably want to arrive here without exiting
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: set -e (no && or ||)
2012-10-12 11:53 ` Peter Stephenson
2012-10-12 13:29 ` Bart Schaefer
@ 2012-10-12 13:49 ` Chet Ramey
1 sibling, 0 replies; 4+ messages in thread
From: Chet Ramey @ 2012-10-12 13:49 UTC (permalink / raw)
To: Peter Stephenson; +Cc: zsh-workers, chet.ramey
On 10/12/12 7:53 AM, Peter Stephenson wrote:
> On Fri, 12 Oct 2012 07:05:41 -0400
> Sergey Fadeev <hindsight@email.com> wrote:
>
>> Why doesn't it exit the shell?
>> $ set -e
>> $ echo $(false)
>> Shouldn't the error code of $(false) command substitution be checked
>> by set -e before passing stdout to the echo builtin?
>
> No, because the command was "echo", and that didn't fail. Exit status
> effectively means exit status seen by the main shell command
> interpreter ($?), although I'm sure there are some subtleties I haven't
> thought about.
>
> The way to get the status of a substitution to fail is to use an
> assignment:
>
> output=$(false)
>
> which does cause the shell to exit on failure, because it would set $? to
> 1. This is standard shell behaviour, though I can't point to where in
> the standard it says.
2.9.1 Simple Commands
If there is a command name, execution shall continue as described in
Command Search and Execution. If there is no command name, but the command
contained a command substitution, the command shall complete with the exit
status of the last command substitution performed. Otherwise, the command
shall complete with a zero exit status.
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRU chet@case.edu http://cnswww.cns.cwru.edu/~chet/
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-10-12 13:55 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-12 11:05 set -e (no && or ||) Sergey Fadeev
2012-10-12 11:53 ` Peter Stephenson
2012-10-12 13:29 ` Bart Schaefer
2012-10-12 13:49 ` Chet Ramey
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).