protect backslash before space
Ray Andrews <[email protected]> Wed, 1 Apr 2026 09:08:32 -0700
| Newsgroups | gmane.comp.shells.zsh.user |
|---|---|
| Message-ID | <[email protected]> |
#!/usr/bin/zsh
alias test='noglob _test'
function _test ()
{
# .... lines of code
eval echo $@
# ... lines of code
}
ls -- $@
run, testing on file 'junk junk':
5 /aWorking/Zsh/Source/Wk 3 % . test junk* && test junk*
'junk junk'
junk junk
5 /aWorking/Zsh/Source/Wk 3 % . test junk\ * && test 'junk\ *'
'junk junk'
junk junk
--------------------------
I like my functions to be able to see their own tail. This is one of
the first brick walls I threw myself against when I first started using
zsh and I understand that it's asking the shell not to do what it's
designed to do. Anyway, it turned out that 'noglob' came close, and
then 'eval' to make the glob expansion when the time came. Works well,
except for the backslash before a space. 'noglob' does not protect it.
I can work around it by simply quoting as I've done in the second run
above. But is there a better way? Reason I bring it up is that I was
wondering if that recent cool stuff that Eric Wybouw was doing that
boiled down to:
BUFFER="= ${(q-)${${BUFFER#=}# }}"
... might point to a solution: some way of 'auto quoting' so that I'd
not have to manually add the quotes as above. Or some other way of
preserving the backslash.
BTW, question: why does the script version above add the single quotes
to indicate a single filename whereas the 'eval'ed version doesn't see
the need? I'd vaguely expect the single quotes in both.