How do I expand an alias defined when using zsh -c?
% zsh -c 'setopt aliases complete_aliases; alias d=date; d'
zsh:1: command not found: d
Use eval to force the zsh to parse the alias after the code has been read in:
zsh -c 'setopt aliases complete_aliases; alias d=date; eval d'
In this case, d will never expand, so doesn't need to be quoted.
In general you should properly quote all arguments to eval.
man zshmisc says:
There is a commonly encountered problem with aliases illustrated by the following code: alias echobar='echo bar'; echobar This prints a message that the command echobar could not be found. This happens because aliases are expanded when the code is read in; the entire line is read in one go, so that when echobar is executed it is too late to expand the newly defined alias. This is often a problem in shell scripts, functions, and code executed with `source' or `.'. Consequently, use of functions rather than aliases is recommended in non-interactive code.
zsh -c 'd() date; d.nohup alias, nice alias, chrt alias etc.zsh -c 'alias d=date; eval d'.viddy (which is just like watch) and to watch the output of a shell alias defined in my ~/.zshrc. For this to work in viddy this does the trick: viddy --shell zsh "source ~/.zshrc; eval ll" (with the alias ll in that case). You'd think I could do zsh --interactive but that causes the shell to exit weirdly for reasons I don't yet grasp.