[klibc] klibc sh doesn't support switching LC_* during a script/session

Christoph Anton Mitterer calestyo at scientia.org
Mon Jan 24 21:08:18 PST 2022


Hey.

I've noticed that klibc sh (like dash - but unlike bash or
busybox ash) doesn't seem to support the follwoing:

Switching LC_*/LANG variables during a script/session and have that
change take effect on the very same script/session.


Consider the following check for this:
# check whether LC_* switch works in one script

#in UTF-8 the following is U+220B CONTAINS AS MEMBER
bs="$(printf '\342\210\213' )"

export LC_ALL=C.UTF-8
len1=${#bs}

export LC_ALL=C
len2=${#bs}

printf '%s %s\n' "${len1}" "${len2}"

# should return "1 2"



Now I'm not really sure whether or not POSIX mandates that this should
work or whether it's unspecified.
I'd kinda vaguely guess that it actually must be supported because of:
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_05_03

Quoting:
"The following variables shall affect the execution of the shell:
[...]
LANG
[...]
LC_ALL
[...]
"

And it really says: the following variables (and the chapter is "Shell
Variables") and "shall affect the execution of the shell".
It does not say, "environment variables" (in the sense that it would
have been just set once when the shell was invoked).


Even if POSIX wouldn't mandate this behaviour, I'd kindly ask to
support it, given that it's a requirement for the (apparently) only
really portable way of implementing/hacking command substitution that
keeps trailing newlines (see
e.g. https://unix.stackexchange.com/a/383390/474076).


Thanks,
Chris.



More information about the klibc mailing list