The title should say it all. I'm looking for an equivalent to ${BASH_SOURCE[0]}
in zsh.
Note: I keep finding "$0
is equivalent to ${BASH_SOURCE[0]}
" around the Internet, but this seems to be false: $0
seems to be the name of the executing command. (It's argv[0]
, which makes sense.) Echoing $0 in my script (.zshrc
) gives zsh
for $0
, which isn't the same as what ${BASH_SOURCE[0]}
is. In fact, ${BASH_SOURCE[0]}
seems to work in zsh
, except for inside .zshrc
files.
What I'm really doing in my .zshrc
(that isn't working):
echo ${BASH_SOURCE[0]} source `dirname $0`/common-shell-rc.sh
The source fails ($0
is zsh
) and the echo
outputs a blank line.
Edit: apparently, for It is apparently on unless you set $0
to work, I need the option FUNCTION_ARGZERO
option set. Any way to test if this is set in a script? (so that I can temporarily set it)nofunction_argzero
, and it is on in my shell. Still get nothing for $0
. (I think b/c I'm not in a function.)
${BASH_SOURCE[0]} (or, more simply, $BASH_SOURCE ) contains the (potentially relative) path of the containing script in all invocation scenarios, notably also when the script is sourced, which is not true for $0 .
The ZSH shell is an extended version of the Bourne Again Shell; thus, most commands and scripts written for bash will work on ZSH. The ZSH shell provides full programming language features such as variables, control flow, loops, functions, and more.
BASH_SOURCE. An array variable whose members are the source filenames where the corresponding shell function names in the FUNCNAME array variable are defined.
${BASH_SOURCE[0]}
equivalent in zsh is ${(%):-%N}
, NOT $0
(as OP said, the latter failed in .zshrc)
Here %
indicates prompt expansion on the value, %N
indicates "The name of the script, sourced file, or shell function that zsh is currently executing,
whichever was started most recently. If there is none, this is equivalent to the parameter $0."(from man zshmisc
)
${(%):-%x}
is the closest zsh
equivalent to bash
's $BASH_SOURCE
(and ksh
's ${.sh.file}
) - not $0
.
Tip of the hat to Hui Zheng for providing the crucial pointer and background information in his answer.
It returns the (potentially relative) path of the enclosing script,
~/.zshrc
(unlike $0
, which inexplicably returns the shell's path there).$0
, which returns the function name inside a function). The only difference to $BASH_SOURCE
I've found is in the following obscure scenario - which may even be a bug (observed in zsh 5.0.5): inside a function nested inside another function in a sourced script, ${(%):-%x}
does not return the enclosing script path when that nested function is called (again) later, after having been sourced (returns either nothing or 'zsh').
Background information on ${(%):-%x}
:
(%):-
in lieu of a variable name in a parameter (variable) expansion (${...}
) makes escape sequences available that are normally used to represent environmental information in prompt strings, such as used in the PS1
variable to determine the string displayed as the primary interactive prompt.
%
is an instance of a parameter expansion flag, all of which are listed in man zshexpn
under the heading Parameter Expansion Flags
.%x
is one of the escape sequences that can be used in prompt strings, and it functions as described above; there are many more, such as %d
to represent the current dir.
man zshmisc
lists all available sequences under the heading SIMPLE PROMPT ESCAPES
.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With