From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 2917 invoked from network); 11 Dec 1998 10:11:02 -0000 Received: from math.gatech.edu (list@130.207.146.50) by ns1.primenet.com.au with SMTP; 11 Dec 1998 10:11:02 -0000 Received: (from list@localhost) by math.gatech.edu (8.9.1/8.9.1) id FAA05276; Fri, 11 Dec 1998 05:09:17 -0500 (EST) Resent-Date: Fri, 11 Dec 1998 05:09:17 -0500 (EST) Message-Id: <9812110952.AA23579@ibmth.df.unipi.it> To: zsh-workers@math.gatech.edu Subject: PATCH: 3.1.5: eval with exported vars In-Reply-To: "Phil Pennock"'s message of "Fri, 11 Dec 1998 08:05:58 NFT." <19981211080558.46630@athenaeum.demon.co.uk> Date: Fri, 11 Dec 1998 10:52:46 +0100 From: Peter Stephenson Resent-Message-ID: <"5shgg.0.KI1.CzESs"@math> Resent-From: zsh-workers@math.gatech.edu X-Mailing-List: archive/latest/4748 X-Loop: zsh-workers@math.gatech.edu Precedence: list Resent-Sender: zsh-workers-request@math.gatech.edu Phil Pennock wrote: > Trying this: > % FOO=x eval sh -c 'echo $FOO' > and then without the eval, it seems the eval loses the auto-export > functionality, in both 3.0.5 and 3.1.5. It doesn't appear to be > documented though. The workaround is eval 'FOO=x sh -c '\'echo $FOO'\' by the way. (Note all the quotes: see below.) > Bug? I was going to say yes, but it's specifically mentioned in the source that it does this (exec.c, line 1793 of my current version): if (cmd->vars) { /* Export this if the command is a shell function, * but not if it's a builtin. */ addvars(cmd->vars, is_shfunc); I think the idea must have been that `builtins don't need values exported' which, as you've seen, is not true in this case. The patch is the simplest fix, and I think it's good enough. There's something that had me horribly confused (though it's actually working the way God intended): % FOO=x eval sh -c 'echo $FOO' That's because eval sees the string "sh -c echo $FOO" and turns this into sh -c 'echo' 'x', so sh gets an 'echo' command with $0 set to x. To prove it: % FOO=x eval sh -c '"echo \$0" $FOO' x (why $0 not $1?) so you really need % FOO=x eval sh -c \''echo $FOO'\' x phew. *** Src/exec.c.eval Thu Dec 10 11:24:46 1998 --- Src/exec.c Fri Dec 11 10:14:01 1998 *************** *** 1792,1800 **** if (cmd->vars) { /* Export this if the command is a shell function, ! * but not if it's a builtin. */ ! addvars(cmd->vars, is_shfunc); if (errflag) { restore_params(restorelist, removelist); lastval = 1; --- 1792,1802 ---- if (cmd->vars) { /* Export this if the command is a shell function, ! * but not if it's a builtin, unless the builtin ! * is an eval. */ ! addvars(cmd->vars, is_shfunc || ! (is_builtin && ((Builtin)hn)->funcid == BIN_EVAL)); if (errflag) { restore_params(restorelist, removelist); lastval = 1; Peter Stephenson Tel: +39 050 844536 WWW: http://www.ifh.de/~pws/ Dipartimento di Fisica, Via Buonarroti 2, 56127 Pisa, Italy