user@alt-p8-edu pulsejoin $ LANG=C pactl Имя команды не указано или не распознано. user@alt-p8-edu pulsejoin $ LC_ALL=C pactl No valid command specified. user@alt-p8-edu pulsejoin $ locale LANG=POSIX LC_CTYPE="ru_RU.UTF-8" LC_NUMERIC="ru_RU.UTF-8" LC_TIME="ru_RU.UTF-8" LC_COLLATE="ru_RU.UTF-8" LC_MONETARY="ru_RU.UTF-8" LC_MESSAGES="ru_RU.UTF-8" LC_PAPER="ru_RU.UTF-8" LC_NAME="ru_RU.UTF-8" LC_ADDRESS="ru_RU.UTF-8" LC_TELEPHONE="ru_RU.UTF-8" LC_MEASUREMENT="ru_RU.UTF-8" LC_IDENTIFICATION="ru_RU.UTF-8" LC_ALL=ru_RU.UTF-8 user@alt-p8-edu pulsejoin $ В новой версии POSIX (https://pubs.opengroup.org/onlinepubs/9699919799/) не нашел про LANG, однако в POSIX 1997 (https://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html) написано: "If the LANG environment variable is defined and is not null, the value of the LANG environment variable is used." Т.е. в моем понимании переменная LANG должна быть приоритетна относительно LC_*, однако пример выше показывает, что LANG не работает. Что касается других дистрибутивов, то в Ubuntu 19.04 (glibc 2.29) LANG работает: user@pay2:~$ LANG=C pactl No valid command specified. user@pay2:~$ pactl Имя команды не указано или не распознано. user@pay2:~$ В ROSA 2016.1 (glibc 2.24) поведение соответствует ALT (https://bugzilla.rosalinux.ru/show_bug.cgi?id=10163) (я вообще изначально подумал, что это специфичный для Росы баг, но в Альте воспроизвел такое же поведение). В коде glibc, файл locale/programs/locale.c: show_locale_vars (void) { const char *lcall = getenv ("LC_ALL") ?: ""; const char *lang = getenv ("LANG") ?: ""; /* LANG has to be the first value. */ print_assignment ("LANG", lang, false); <...>
Не смотря на имя хоста alt-p8-edu, это было на Сизифе. user@alt-p8-edu pulsejoin $ rpm -q glibc glibc-2.27-alt10.x86_64
Мне сейчас некогда выяснять детали, но могу вас заверить, что поведение glibc в этом вопросе у всех одинаковое и соответствует стандартам.
Из https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html : LC_ALL This variable shall determine the values for all locale categories. The value of the LC_ALL environment variable has precedence over any of the other environment variables starting with LC_ (LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME) and the LANG environment variable. Так что поведение у вас верное, ибо указан LC_ALL
Спасибо. Там еще написано: "If the LC_ALL environment variable is defined and is not null, the value of LC_ALL shall be used." Это условие приоритетнее, чем "If the LANG environment variable is defined and is not null, the value of the LANG environment variable is used." Тогда действительно это не ошибка, прошу прощения.