Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm
Precedence: bulk
X-No-Archive: yes
List-Id: Zsh Workers List <zsh-workers.zsh.org>
List-Post: <mailto:zsh-workers@zsh.org>
List-Help: <mailto:zsh-workers-help@zsh.org>
X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on f.primenet.com.au
X-Spam-Level: 
X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham
	autolearn_force=no version=3.4.0
Date: Fri, 29 Jan 2016 09:18:34 +0000
From: Daniel Shahaf <d.s@daniel.shahaf.name>
To: Bart Schaefer <schaefer@brasslantern.com>
Cc: zsh-workers@zsh.org
Subject: Re: [PATCH] typeset: set $? on incidental error
Message-ID: <20160129091834.GA8420@tarsus.local2>
References: <20160123235300.GC20278@tarsus.local2>
 <56A445E0.50706@gmx.com>
 <20160126225008.GA4731@tarsus.local2>
 <160126201724.ZM2552@torch.brasslantern.com>
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
In-Reply-To: <160126201724.ZM2552@torch.brasslantern.com>
User-Agent: Mutt/1.5.23 (2014-03-12)
X-Seq: zsh-workers 37831

Bart Schaefer wrote on Tue, Jan 26, 2016 at 20:17:24 -0800:
> On Jan 26, 10:50pm, Daniel Shahaf wrote:
> }
> } If existing typesets always exit zero in the circumstance that the patch
> } proposes to change, no code would be broken by this change (no existing
> } code, no new zsh-targeted code, no new ksh-targeted code), except for
> } new ksh-targeted code written by zsh users who won't be aware of this
> } difference.
> 
> This is not true.  Scripts using "setopt errexit" or "setopt errreturn"
> or "set -e" will fail in ways they did not fail before.

Scripts using errexit would have a new early-out failure mode.  I think
taking the new early-out would, at least in some cases, be the right
thing to do: it may be better to abort than to process invalid or
incomplete data.  I agree that it might be a bug in other cases.

All that said, I suppose we may as well stop here: it's clear the
original patch isn't on the verge of being applied.  How about a docs
patch instead, to point out the difference in behaviour? —

diff --git a/Doc/Zsh/builtins.yo b/Doc/Zsh/builtins.yo
index fb630a7..6e3d146 100644
--- a/Doc/Zsh/builtins.yo
+++ b/Doc/Zsh/builtins.yo
@@ -1826,6 +1826,23 @@ reserved word interface for tt(typeset) may cause problems with the
 output of `tt(typeset -p)', which assumes the reserved word interface is
 available in order to restore array and associative array values.
 
+Unlike parameter assignment statements, tt(typeset)'s exit status on an
+assignment that involves a command substitution does not reflect the exit
+status of the command substitution.  Therefore, to test for an error in
+a command substitution, separate the declaration of the parameter from its
+initialization:
+
+example(# WRONG
+typeset var1=$(exit 1) || echo "Trouble with var1"
+
+# RIGHT
+typeset var1 && var1=$(exit 1) || echo "Trouble with var1"
+)
+
+To initialize a parameter var(param) to a command output and mark it readonly,
+use tt(typeset -r )var(param) or tt(readonly )var(param) after the parameter
+assignment statement.
+
 If the shell option tt(TYPESET_SILENT) is not set, for each remaining
 var(name) that refers to a parameter that is already set, the name and
 value of the parameter are printed in the form of an assignment.

Cheers,

Daniel

