Search code examples
bashenvironment-variablesshzsh

Make ZSH pass a variable as space-delimited parameters


I would like to create an alias that works in zsh and bash, but weirdly enough zsh tries to pass on an unquoted variable as a single argument:

❯ zsh -f
grasshopper% LS_OPTIONS="-l -a" && ls $LS_OPTIONS
ls: invalid option -- ' '
Try 'ls --help' for more information.
grasshopper% bash --norc
bash-5.1$ LS_OPTIONS="-l -a" && ls $LS_OPTIONS
total 0
drwxr-xr-x  2 janekf janekf   40 28. Nov 14:02 .
drwxrwxrwt 24 root   root   2400 28. Nov 16:41 ..

Is there a option to stop that?

See also Using variables as command arguments in zsh, but the answer there is zsh-specific.


Solution

  • If you want something that works in both zsh and bash, use an array.

    LS_OPTIONS=(-l -a) && ls "${LS_OPTIONS[@]}"
    

    You can set the SH_WORD_SPLIT option in zsh to make parameter expansions undergo word-splitting just as in bash, but unquoted expansions in bash are subject to pathname expansion as well, so I don't recommend their use.