On Thu, Aug 6, 2026 at 2:16 PM Chet Ramey <[email protected]> wrote:
>
> On 8/4/26 11:35 PM, zheng wrote:
> > # Bash bug report: variable-name parsing swallows first byte of multibyte 
> > UTF-8 char
> >
> > ## Summary
> > In a UTF-8 locale, `$VAR` immediately followed by a multibyte (non-ASCII)
> > character causes bash to treat the first byte of that character as part of 
> > the
> > variable name.
>
> Thanks for the report.
>
> Well, certain characters on certain systems. Certainly that particular byte
> on macOS.
>
> Bash knows that variable names are composed of bytes, and that only certain
> bytes are valid ([_0-9a-zA-Z]). It uses isalnum(3) and isalpha(3) to check,
> trusting that in, say, en_US, characters > 127 and <= UCHAR_MAX will fail
> both tests.
>
> This isn't strictly kosher, because bash uses setlocale(3) to set the
> various locale categories at program startup, so these checks are subject
> to LC_CTYPE. In this case, the first byte of the `,' multibyte sequence
> returns true for isalnum() (specifically islower()), even though the
> numeric value of the byte is 239, and it certainly doesn't render as
> anything in Terminal (though isprint() returns 1).
>
> (I seem to remember something about macOS incorrectly returning true for
> isalpha/isupper/islower/isalnum for characters in this range, but I can't
> remember exactly what. Nevertheless.)

This came up for isspace relatively recently:
https://lists.gnu.org/archive/html/bug-bash/2023-05/msg00132.html

Reply via email to