I've ask this question a couple of days before but I didn't get any response [1]. I think this may be a bug. If I define a shell function like this one: do_print() { print "__${NAME}__" # print environment variable "NAME" } and later call the function while setting the environment variable "NAME" NAME="hello" do_print the output is "__hello__" as everybody would expect. But if the function is called this way NAME="hello" # set NAME (no export) NAME="::${NAME}::" do_print # export something as NAME containing $NAME the output is "__::::__" instead of "__::hello::__". If the same think is done using a command instead of a shell function the output is "__::hello::__". Refer to the older email [1] for a listing of different test cases. [1] http://www.zsh.org/mla/users/2010/msg00644.html