From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8540 invoked by alias); 29 Oct 2016 18:15:02 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 39758 Received: (qmail 12566 invoked from network); 29 Oct 2016 18:15:02 -0000 X-Qmail-Scanner-Diagnostics: from mail-ua0-f169.google.com by f.primenet.com.au (envelope-from , uid 7791) with qmail-scanner-2.11 (clamdscan: 0.99.2/21882. spamassassin: 3.4.1. Clear:RC:0(209.85.217.169):SA:0(0.0/5.0):. Processed in 0.657346 secs); 29 Oct 2016 18:15:02 -0000 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=SPF_PASS,T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.1 X-Envelope-From: schaefer@brasslantern.com X-Qmail-Scanner-Mime-Attachments: | X-Qmail-Scanner-Zip-Files: | Received-SPF: pass (ns1.primenet.com.au: SPF record at _netblocks.google.com designates 209.85.217.169 as permitted sender) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=brasslantern-com.20150623.gappssmtp.com; s=20150623; h=from:message-id:date:in-reply-to:comments:references:to:subject :mime-version; bh=LHlTJw9Zveb3nF5LwMJp48B8kGZP0bvH8c59kDzkkts=; b=AXbHPxhrk02j4wTjgq0NJu0oXSo8qMGGOcmsE9/Gw2FkKNn3fjVy8OBqYGt6PVb1/K wF1mPphMxVisu773t2TAAQYKSknrkJx0nvFdeR2Nw2r9ZiRIGmX6K/ZBeqwJZFdm/jXM VTAFpQtFR0KbPbd9TEPe+d42TM8oqpDCcb/CNf8haVwk8YYzsYlxJC/mf0Uqv+eCjySa EgR9HY/hb2PGSwooNQb1QTkT8fKNB5bco/KcH/qDtsUztH0ZBLyscwmC3ug0aiQoPhVc Wvz/7TG0OQVlTkRfLbjOCL56XkwgaefAdiyHCbTWfDBvgbLeGuH5xyKrE7h1gkPKlWE4 xdrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:message-id:date:in-reply-to:comments :references:to:subject:mime-version; bh=LHlTJw9Zveb3nF5LwMJp48B8kGZP0bvH8c59kDzkkts=; b=f/lnK8nFT22+TLp4uRzeKb6LfI66PfpG4a/nXX3qWz3X3CCYffe8jfB86suzXmZt5d 55PPHzzxK6yUGBooBhPyQh81LMcNiuqJMbMnAzLvwblAArdbuuYxy4inzdOFJkkGm3Ns OpUbwUTvqvzjUw1rlC7S0RdNAiICXz7p6KXITItxoNKBxtLuAzwG1MWWa8SbvsqZuYPS bZCZ7ArRtZtmZDkvOX+UI9vxGDoGpQ+YnAP1aEndT4FZrabVh5IHQ0vkuvwv0gQjmMXe SL2nzBQCxMcjBH6FiwtawwBiq1WruSRpE/HAXcByrpSPK2cHcJxmFk/IWkjnpq9aeqnY Ku4g== X-Gm-Message-State: ABUngveQw4lpeDXqNyQ2oPtJRN9fumqVEYHh/PnjepT8P+/2zwV7xU4OAHEEBTf1IIdXSA== X-Received: by 10.176.81.238 with SMTP id h43mr833349uaa.83.1477764525500; Sat, 29 Oct 2016 11:08:45 -0700 (PDT) From: Bart Schaefer Message-Id: <161029110904.ZM2918@torch.brasslantern.com> Date: Sat, 29 Oct 2016 11:09:04 -0700 In-Reply-To: <6db9e2a5-8f0b-71a2-95e6-8a8bbf4a281e@inlv.org> Comments: In reply to Martijn Dekker "Re: exported unset variables [was: 'export -p' lacks POSIX output]" (Oct 29, 9:11am) References: <9a5b08ae-f45b-d1df-9b3b-dd47a0f62412@inlv.org> <161028143156.ZM19947@torch.brasslantern.com> <161028171859.ZM2366@torch.brasslantern.com> <6db9e2a5-8f0b-71a2-95e6-8a8bbf4a281e@inlv.org> X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: Zsh hackers list Subject: Re: exported unset variables [was: 'export -p' lacks POSIX output] MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii On Oct 29, 9:11am, Martijn Dekker wrote: } Subject: Re: exported unset variables [was: 'export -p' lacks POSIX output } } % var=; echo ${var+set} ${var-unset}; typeset -p var } set } typeset var='' } } The variable name loses its export attribute upon assignment; it should } retain it. That one potentially gets rather ugly; consider: % setopt POSIXBUILTINS % export var % var=() zsh: var: attempt to assign array value to non-array Is that OK with everyone? As an aside, zsh currently allows the export flag to be applied to array variables, but then will not put them in the environment. Patch below revises 39704 to use "typeset -xa ary" rather than "export -a ary". Replaces 39754. diff --git a/Src/builtin.c b/Src/builtin.c index 2db739f..986ace2 100644 --- a/Src/builtin.c +++ b/Src/builtin.c @@ -2008,11 +2008,12 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), * handled in createparam(). Here we just avoid using it for the * present tests if it's unset. * - * POSIXBUILTINS horror: we need to retain the 'readonly' flag - * of an unset parameter. + * POSIXBUILTINS horror: we need to retain the 'readonly' or 'export' + * flags of an unset parameter. */ usepm = pm && (!(pm->node.flags & PM_UNSET) || - (isset(POSIXBUILTINS) && (pm->node.flags & PM_READONLY))); + (isset(POSIXBUILTINS) && + (pm->node.flags & (PM_READONLY|PM_EXPORTED)))); /* * We need to compare types with an existing pm if special, @@ -2135,7 +2136,8 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), /* * Stricter rules about retaining readonly attribute in this case. */ - if ((on & PM_READONLY) && (!usepm || (pm->node.flags & PM_UNSET)) && + if ((on & (PM_READONLY|PM_EXPORTED)) && + (!usepm || (pm->node.flags & PM_UNSET)) && !ASG_VALUEP(asg)) on |= PM_UNSET; else if (usepm && (pm->node.flags & PM_READONLY) && @@ -2143,6 +2145,10 @@ typeset_single(char *cname, char *pname, Param pm, UNUSED(int func), zerr("read-only variable: %s", pm->node.nam); return NULL; } + /* This is handled by createparam(): + if (usepm && (pm->node.flags & PM_EXPORTED) && !(off & PM_EXPORTED)) + on |= PM_EXPORTED; + */ } /* diff --git a/Src/params.c b/Src/params.c index 3084b1f..330f22b 100644 --- a/Src/params.c +++ b/Src/params.c @@ -940,7 +940,10 @@ createparam(char *name, int flags) zerr("%s: restricted", name); return NULL; } - if (!(oldpm->node.flags & PM_UNSET) || (oldpm->node.flags & PM_SPECIAL)) { + if (!(oldpm->node.flags & PM_UNSET) || + (oldpm->node.flags & PM_SPECIAL) || + /* POSIXBUILTINS horror: we need to retain 'export' flags */ + (isset(POSIXBUILTINS) && (oldpm->node.flags & PM_EXPORTED))) { oldpm->node.flags &= ~PM_UNSET; if ((oldpm->node.flags & PM_SPECIAL) && oldpm->ename) { Param altpm = @@ -5225,10 +5228,6 @@ printparamvalue(Param p, int printflags) { char *t, **u; - if ((p->node.flags & PM_EXPORTED) && !p->env) { - putchar('\n'); - return; - } if (printflags & PRINT_KV_PAIR) putchar(' '); else @@ -5332,7 +5331,8 @@ printparamnode(HashNode hn, int printflags) } if (locallevel && p->level >= locallevel) { printf("typeset "); /* printf("local "); */ - } else if (p->node.flags & PM_EXPORTED) { + } else if ((p->node.flags & PM_EXPORTED) && + !(p->node.flags & (PM_ARRAY|PM_HASHED))) { printf("export "); } else if (locallevel) { printf("typeset -g "); @@ -5350,8 +5350,8 @@ printparamnode(HashNode hn, int printflags) if (pmptr->flags & PMTF_TEST_LEVEL) { if (p->level) doprint = 1; - } else if ((pmptr->binflag != PM_EXPORTED || - ((p->node.flags & PM_LOCAL) || p->level)) && + } else if ((pmptr->binflag != PM_EXPORTED || p->level || + (p->node.flags & (PM_LOCAL|PM_ARRAY|PM_HASHED))) && (p->node.flags & pmptr->binflag)) doprint = 1;