Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: how to refer to basename of $0

On Thu, 28 Jul 2011, TJ Luoma wrote:

I am trying to move a bunch of my scripts to zsh instead of bash because I'm starting to run into little differences in the way things are handled which are annoying, and I figured it made more sense to just learn one way rather than two.

I have a ".source" file that I use to setup some functions and variables for use in my scripts, and one of the things it does it this:

NAME=`basename $0`

which, in bash, gives me the basename of the script. For example, if the script "foo.sh" read .source like this:

	. $HOME/.source

and then I did

	echo "$NAME"

it would give me


but in zsh I get


Sounds like you're not actually 'source'-ing the script. $0 should give you the script name in that case. $0 will vary if it's in the top-level scope or inside a function, though. For finer-grained control, you can use the '(%)' parameter expansion flag on the string "%x". (also see %N, but that has the same caveats as $0, AFAIK.)

Try the script below, running in these several ways:

. ./basename-0.zsh
eval "$(<basename-0.zsh)"


$ cat > basename-0.zsh <<'SCRIPT'

echo 0 outside: $0:t
afunction () { echo 0 in afunction: $0:t }
() { echo 0 in anon: $0:t }
echo 0 in a subshell: "$(/bin/echo $0:t)"

echo %x outside: ${${(%):-%x}:t}
anotherfunc () { echo %x in anotherfunc: ${${(%):-%x}:t} }
() { echo %x in anon: ${${(%):-%x}:t} }
echo %x in a subshell: "$(/bin/echo ${${(%):-%x}:t})"
$ chmod +x basename-0.zsh

Messages sorted by: Reverse Date, Date, Thread, Author