Bug 37231

Summary: Обработка переменной LANG нарушает POSIX
Product: Sisyphus Reporter: mikhailnov <mikhailnov>
Component: glibcAssignee: placeholder <placeholder>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: evg, glebfm, ldv, placeholder
Version: unstable   
Hardware: all   
OS: Linux   

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."

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