On Mon, Jun 1, 2026 at 5:45 PM Grisha Levit <[email protected]> wrote:
>
> On Mon, Jun 1, 2026, 06:54 Andrei Borzenkov <[email protected]> wrote:
> >
> > On Sun, May 31, 2026 at 5:32 PM Andreas Schwab <[email protected]> 
> > wrote:
> > >
> > > On Mai 31 2026, Andrei Borzenkov wrote:
> > >
> > > > $ bar='\*'
> > > > $ ls $bar
> > > > ls: cannot access '\*': No such file or directory
> > > > $
> > > >
> > > > Oops. Why it suddenly attempts to match *two* characters "\*" instead of
> > > > just one literal "*"?
> > >
> > > Because '\*' is not a glob, so filename expansion is not performed.
> > >
> >
> > Actually it is. Pathname expansion is performed on the result of the
> > parameter expansion and pathname expansion interprets the current
> > content of the word in question as pattern:
> >
> > After field splitting, if set -f is not in effect, each field in the
> > resulting command line shall be expanded using the algorithm described
> > in 2.14 Pattern Matching Notation, qualified by the rules in 2.14.3
> > Patterns Used for Filename Expansion.
> >
> > bash decides to optimize globbing by skipping pathname expansion when
> > it believes it is not necessary, but in this case it *is* necessary to
> > arrive at the correct result.
> >
> > Now, if the file with the name "*" did not exist, the end result had
> > been correct - bash returns the literal pattern string that includes
> > '\'. But the result is wrong when the matching file actually exists.
>
> You mention a number of combinations, so I'm not sure which pattern it
> is you say has incorrect results depending on if a matching file exists
> or not?
>
>     $ touch '*'; p='\*'; echo $p # 1A
>     \*

This one.

>     $ rm -f '*'; p='\*'; echo $p # 1B
>     \*
>
>     $ touch '*'; p='\**'; echo $p # 2A
>     *
>     $ rm -f '*'; p='\**'; echo $p # 2B
>     \**

Reply via email to