Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: zsh expansion fails if nocaseglob and not all directory components are listable

Oliver Freyermuth wrote on Mon, 22 Aug 2022 18:02 +00:00:
> 1) Prepare directory:
> mkdir foo
> chmod 711 foo
> mkdir foo/test
> sudo chown root:root foo
> cd foo/test
> setopt nocaseglob
> echo $(pwd)(N)
> => No output is returned.

If the (N) is changed to (|) [that's an empty alternation], one gets
a "no matches found" error.

> Of course, zsh can not exclude there are other directories directly 
> inside "foo/" matching the given pattern (but with different case) 
> since "foo/" can not be listed. However, at least the explicit match 
> with case is known,
> so I'm astonished zero matches are returned.
> Is this expected, or a bug?

What would you have it do instead?

  Emit just one path?  I don't think this would work, because if the
  glob expands at all, users may rely on what it _didn't_ expand to.
  It's perfectly within the API promise for a user to set NO_CASE_GLOB
  and then rely on something along the lines of the lines of «if print -l
  /etc(|) | grep -q /ETC; then …» (note that grep(1) is case-sensitive
  in this case).

  For comparison, consider «*(u.jrandom.)» and assume a single file in
  the directory returned -1 from stat(2) (so owner uid isn't known).
  Would it be okay to just elide that file from the glob's expansion?

- Error out hard?  NULL_GLOB is typically used to mean "Treat a glob
  with zero matches the same way as any other glob", and this case is
  rather "We couldn't determine the number of matches", so, maybe?

- Enumerate all paths that compare case-insensitively equal to
  a different path and expand the glob as in the non-0711 case?  Even
  assuming ASCII English this is O(2**N) in the length of the path
  (e.g., "test" is length 4 and has 2**4 possibilities), so, not tractable.

Could be that I'm missing something, of course…


Messages sorted by: Reverse Date, Date, Thread, Author