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