Been a long time user of ksh, switching to try zsh. My version: ~ 1% uname -a 0:26:57 Darwin KVARADHA-M-40SH 14.3.0 Darwin Kernel Version 14.3.0: Mon Mar 23 11:59:05 PDT 2015; root:xnu-2782.20.48~5/RELEASE_X86_64 x86_64 ~ 2% echo $ZSH_VERSION 0:26:59 5.0.5 ~ 3% echo $ZSH_PATCHLEVEL 0:27:18 zsh-5.0.5-0-g79abe00 ~ 4% 0:27:23 Four Issues in this one email, sorry: Issue #1: Programmatic Scripting, how to? Issue #2. Overridden local variables get echoed? Issue #3. Typeset -U from within a nested function behaves unpredictably (1) Issue #4. Typeset -U from within a nested function really seems to get ignored (2) Details below. Wondering if these are known, and how to either report or address. Thanks, Kannan Issue #1: Programmatic Scripting, how to? I would like to do the following: for var in path infopath manpath cdpath ; do typeset -agU $var local capsvar capsvar=$(echo $var | tr 'a-z' 'A-Z') $var=( $(echo ${$capsvar} | sed 's/:/ /g') ) done But this does not work, because ${$capsvar} gets me a zsh: bad substitution. Is there any way to achieve this in zsh? Issue #2. Overridden local variables get echoed? ~ 5% cat lib/zsh/test2 9:55:52 function test2 print why is the previous value echoed when a local variable is 'overridden?' local _t2 for _t2 in 0 1 2 ; do local _t3 _t3=XXX__${_t2}__ done } set -x ~ 6% autoload test2 9:55:55 ~ 7% test2 9:56:01 +test2:1> print why is the previous value echoed when a local variable is 'overridden?' why is the previous value echoed when a local variable is overridden? +test2:3> local _t2 +test2:4> _t2=0 +test2:5> local _t3 +test2:6> _t3=XXX__0__ +test2:4> _t2=1 +test2:5> local _t3 _t3=XXX__0__ +test2:6> _t3=XXX__1__ +test2:4> _t2=2 +test2:5> local _t3 _t3=XXX__1__ +test2:6> _t3=XXX__2__ ~ 8% 9:56:03 Issue #3. Typeset -U from within a nested function behaves unpredictably (1) Consider the following two functions: ap and _ap. ~ 1% cat lib/zsh/ap lib/zsh/_ap 10:11:21 function ap { local _api for _api in "$@" ; do _ap "" PATH $_api/bin $_api/sbin done } autoload _ap function _ap { local _shift _envar _enval _i _shift=$1 ; shift _envar=$1 ; shift : '***' EXPECT FULL PATH VARIABLE BELOW '***' _enval=$(eval echo \$$_envar) } # guarantee uniqueness : PATH = $PATH typeset -U PATH ~ 2% 10:11:27 ~ 2% 10:11:29 ~ 2% setopt KSH_AUTOLOAD 10:11:30 ~ 3% autoload ap 10:11:39 ~ 4% set -x 10:12:37 ~ 5% ap x y 10:12:39 +-zsh:7> ap x y +ap:7> autoload _ap +ap:1> local _api +ap:2> _api=x +ap:3> _ap '' PATH x/bin x/sbin +ap:9> : PATH '=' /Users/kvaradha/sbin:/Users/kvaradha/bin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:./bin:./sbin:../bin:../sbin +ap:10> typeset -U PATH +_ap:1> local _shift _envar _enval _i +_ap:2> _shift='' +_ap:2> shift +_ap:3> _envar=PATH +_ap:3> shift +_ap:4> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:5> _enval=+_ap:5> eval echo '$PATH' +(eval):1> echo +_ap:5> _enval='' +ap:2> _api=y +ap:3> _ap '' PATH y/bin y/sbin +_ap:1> local _shift _envar _enval _i +_ap:2> _shift='' +_ap:2> shift +_ap:3> _envar=PATH +_ap:3> shift +_ap:4> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:5> _enval=+_ap:5> eval echo '$PATH' +(eval):1> echo /Users/kvaradha/sbin:/Users/kvaradha/bin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:./bin:./sbin:../bin:../sbin +_ap:5> _enval=/Users/kvaradha/sbin:/Users/kvaradha/bin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:./bin:./sbin:../bin:../sbin ~ 6% 10:12:4 If I remove the typeset -U PATH in _ap, as: ~ 1% cat lib/zsh/_ap 10:15:28 function _ap { local _shift _envar _enval _i _shift=$1 ; shift _envar=$1 ; shift : '***' EXPECT FULL PATH VARIABLE BELOW '***' _enval=$(eval echo \$$_envar) } # guarantee uniqueness : PATH = $PATH : typeset -U PATH ~ 2% 10:15:35 ~ 2% 10:15:36 ~ 2% setopt KSH_AUTOLOAD 10:15:36 ~ 3% autoload ap 10:15:40 ~ 4% set -x 10:15:43 ~ 5% ap x y 10:15:52 +-zsh:7> ap x y +ap:7> autoload _ap +ap:1> local _api +ap:2> _api=x +ap:3> _ap '' PATH x/bin x/sbin +ap:9> : PATH '=' /Users/kvaradha/sbin:/Users/kvaradha/bin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:./bin:./sbin:../bin:../sbin +ap:10> : typeset -U PATH +_ap:1> local _shift _envar _enval _i +_ap:2> _shift='' +_ap:2> shift +_ap:3> _envar=PATH +_ap:3> shift +_ap:4> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:5> _enval=+_ap:5> eval echo '$PATH' +(eval):1> echo /Users/kvaradha/sbin:/Users/kvaradha/bin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:./bin:./sbin:../bin:../sbin +_ap:5> _enval=/Users/kvaradha/sbin:/Users/kvaradha/bin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:./bin:./sbin:../bin:../sbin +ap:2> _api=y +ap:3> _ap '' PATH y/bin y/sbin +_ap:1> local _shift _envar _enval _i +_ap:2> _shift='' +_ap:2> shift +_ap:3> _envar=PATH +_ap:3> shift +_ap:4> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:5> _enval=+_ap:5> eval echo '$PATH' +(eval):1> echo /Users/kvaradha/sbin:/Users/kvaradha/bin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:./bin:./sbin:../bin:../sbin +_ap:5> _enval=/Users/kvaradha/sbin:/Users/kvaradha/bin:/opt/local/sbin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:./bin:./sbin:../bin:../sbin ~ 6% 10:15:53 Issue #4. Typeset -U from within a nested function really seems to get ignored (2) Consider the same two functions: ap and _ap. ~ 1% typeset -U 10:30:44 ~ 2% setopt KSH_AUTOLOAD 10:30:50 ~ 3% autoload ap 10:30:55 ~ 4% cat lib/zsh/_ap 10:30:57 function _ap { local _shift _envar _enval _i _shift=$1 ; shift _envar=$1 ; shift set -x for _i in "$@" ; do : '***' EXPECT FULL PATH VARIABLE BELOW '***' _enval=$(eval echo \$$_envar) export $_envar=$_i:$_enval done set +x } set -x # guarantee uniqueness : PATH = $PATH typeset -U PATH set +x ~ 5% ap x x x 10:31:01 +ap:15> : PATH '=' /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +ap:16> typeset -U PATH +ap:17> set +x +_ap:5> _i=x/bin +_ap:6> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:7> _enval=+_ap:7> eval echo '$PATH' +(eval):1> echo +_ap:7> _enval='' +_ap:8> export 'PATH=x/bin:' +_ap:5> _i=x/sbin +_ap:6> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:7> _enval=+_ap:7> eval echo '$PATH' +(eval):1> echo x/bin: +_ap:7> _enval=x/bin: +_ap:8> export 'PATH=x/sbin:x/bin:' +_ap:10> set +x +_ap:5> _i=x/bin +_ap:6> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:7> _enval=+_ap:7> eval echo '$PATH' +(eval):1> echo /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +_ap:7> _enval=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +_ap:8> export 'PATH=x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin' +_ap:5> _i=x/sbin +_ap:6> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:7> _enval=+_ap:7> eval echo '$PATH' +(eval):1> echo x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +_ap:7> _enval=x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +_ap:8> export 'PATH=x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin' +_ap:10> set +x +_ap:5> _i=x/bin +_ap:6> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:7> _enval=+_ap:7> eval echo '$PATH' +(eval):1> echo x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +_ap:7> _enval=x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +_ap:8> export 'PATH=x/bin:x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin' +_ap:5> _i=x/sbin +_ap:6> : '***' EXPECT FULL PATH VARIABLE BELOW '***' +_ap:7> _enval=+_ap:7> eval echo '$PATH' +(eval):1> echo x/bin:x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +_ap:7> _enval=x/bin:x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin +_ap:8> export 'PATH=x/sbin:x/bin:x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin' +_ap:10> set +x ~ 6% typeset -U 10:31:12 ~ 7% echo $PATH 10:31:16 x/sbin:x/bin:x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin ~ 8% typeset -U PATH 10:31:26 ~ 9% echo $PATH 10:31:29 x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin ~ 10% typeset -U 10:31:32 PATH=x/sbin:x/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin ~ 11% 10:31:35