Bug 37231 - Обработка переменной LANG нарушает POSIX
Summary: Обработка переменной LANG нарушает POSIX
Status: CLOSED NOTABUG
Alias: None
Product: Sisyphus
Classification: Development
Component: glibc (show other bugs)
Version: unstable
Hardware: all Linux
: P3 normal
Assignee: placeholder@altlinux.org
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-09-18 00:58 MSK by mikhailnov
Modified: 2019-09-18 13:09 MSK (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description mikhailnov 2019-09-18 00:58:28 MSK
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);
<...>
Comment 1 mikhailnov 2019-09-18 01:01:53 MSK
Не смотря на имя хоста alt-p8-edu, это было на Сизифе.

user@alt-p8-edu pulsejoin $ rpm -q glibc
glibc-2.27-alt10.x86_64
Comment 2 Dmitry V. Levin 2019-09-18 01:56:06 MSK
Мне сейчас некогда выяснять детали, но могу вас заверить, что поведение glibc в этом вопросе у всех одинаковое и соответствует стандартам.
Comment 3 Evgenii Terechkov 2019-09-18 10:13:37 MSK
Из 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
Comment 4 mikhailnov 2019-09-18 13:09:52 MSK
Спасибо. Там еще написано:
"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."

Тогда действительно это не ошибка, прошу прощения.