Am 13.10.2026 um 17:04 schrieb Edgar Fuß:
> make(1) from -11 chokes on character lists in globs ending with a hyphen:
> 
>       foo= foo bar foo-bar
> 
>       default:
>               echo ${foo:M*[+-]*}
> 
> However, glob(7) says
> 
>       In order to represent itself, a `-' must either be quoted
>       or the first or last character in the character list.
> 
> and this works as expected with make(1) from -10.

Depending on what you expect. Since 1993, your particular pattern has
also matched the words "UPPER", "Mixed" and "mixeD", but not "lower".

That's because when make(1) parses a character range such as '+-]', it
treats ']' as an ordinary character. The range is thus from '+' to ']',
which includes all uppercase letters.

After make(1) has determined that the character range matches, it scans
for the closing ']' of the character list, but it surprisingly starts
from the beginning of the character range. This time, the ']' is not an
ordinary character anymore but instead finishes the character list.

These two completely different interpretations of ']' make it
error-prone. Therefore, even though "it is UNIX", I'd want make(1) to
reject patterns that behave unexpectedly, and this pattern is one of them.

The pattern that does what you expect is "*[+-+-]*".

Roland

Reply via email to