I love zsh, but sometimes it's a tough love. Building command lines in strings is very hard because zsh doesn't want you hurting yourself on argument splitting like bash, so I just banged my head on that for like 15 minutes before I quit being dumb. Building them in arrays is super trivial:
% a=(args foo bar) % b=$(ls) % a=($a $b) # expands $a, adds $b to the end as a single argument % $a 1=foo 2=bar 3=file1 file2
Note that arg 3 is multiple words/lines, but one arg. That's a nightmare to express in bash, but makes perfect sense at the
exec level used by "real" (non-shell) programming languages.
args is a very useful debugging script I've had in some form since the '80s:
#!/bin/zsh i=1 while [[ $# -gt 0 ]]; do echo "$i=$1" let i=i+1 shift done