Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: equivalent of "if (( $+commands[FOO] ))" for functions?
On Mon, 6 Aug 2012, TjL wrote:
I only recently learned about this method of taking some action only
if the command 'FOO' is found:
if (( $+commands[FOO] ))
then
# take actions
fi
but what I am wondering is: is there a way to have this same sort of
check, except that it also includes zsh functions/aliases?
If yes, what's the syntax for that?
if (( $+functions[FOO] )) ; then : actions here ; fi
if (( $+aliases[FOO] )) ; then : actions here ; fi
The $commands, $functions, and $aliases associative arrays are described
in `man zshmodules` under the heading:
THE ZSH/PARAMETER MODULE
In case you've only seen the idiom you're using, and didn't have an
explanation:
$+param expands to 0 if param is unset, and 1 if it's set. The double
parentheses: (( ... )) just make the conditional "mathy" (so that
non-zero is true). So, you can use this with your own associative
arrays, too:
typeset -A some_array
some_array+=( foo some-foo-thing )
if (( $+some_array[foo] ))
then
echo yay
fi
Otherwise I'll keep using 'which' and sending the output to /dev/null
but I figured it was worth asking.
Combining what you've asked about: to execute some action whether FOO is
a command, an alias, or a function (or a built-in):
if (( $+commands[FOO] || $+functions[FOO] || $+aliases[FOO] || $+builtins[FOO] ))
then
# actions
fi
But, since `which` is itself a shell built-in, it might be quicker and
easier to just keep using it:
if which FOO &> /dev/null
then
# actions
fi
I generally use (($+commands[FOO])) to test for whether a command is
installed (and usually to run `alias FOO=something` if it's not). Using
which FOO &> /dev/null lets the user override FOO in a different way.
--
Best,
Ben
Messages sorted by:
Reverse Date,
Date,
Thread,
Author