Debian Linux

Linux: предупреждение setlocale: LC_ALL: cannot change locale

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

Предупреждение появляется, когда нужная локаль не сгенерирована. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Генерация
  5. Переменные окружения
  6. Контейнеры и минимальные образы

#Что означает ошибка

Сообщение
perl: warning: Setting locale failed setlocale: LC_ALL: cannot change locale

perl: warning: Setting locale failed и locale: Cannot set LC_ALL to default locale: No such file or directory означают, что системе не сгенерированы локали, запрошенные переменными окружения (LANG, LC_ALL). Часто возникает по SSH, когда клиент передаёт свою локаль (ru_RU.UTF-8), которой нет на сервере.

Предупреждение безвредно, но раздражает и ломает часть скриптов.

Лечится генерацией нужной локали.

Предупреждение появляется, когда нужная локаль не сгенерирована. Исправляется настройкой locales и генерацией нужной локали.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Локаль не сгенерированаНет данных.Сгенерируйте.
Неверные переменные LANG и LC_ALLСреда SSH.Исправьте.
Пакет locales не установленМинимальная система.Установите.
Передача локали по SSHКлиент.Отключите SendEnv.

#Пошаговое решение

  1. Проверьте locale и locale -aОткройте терминал Debian и выполните locale и locale -a. Запишите значение, указанное после предупреждения setlocale: cannot change locale, затем проверьте его наличие среди установленных вариантов с .utf8/.UTF-8. Если отсутствует, установите пакет locales и запустите штатную настройку, а не удаляйте пользовательский профиль.
  2. Установите пакет localesОткройте терминал Debian и выполните dpkg -s locales | grep Status. Если пакет отсутствует, пользователь с доступом sudo может установить его командой sudo apt update && sudo apt install locales. После установки запустите sudo dpkg-reconfigure locales, в списке отметьте нужную локаль с кодировкой UTF-8 (например, ru_RU.UTF-8), подтвердите выбор и выберите её локалью по умолчанию только если это соответствует настройкам системы. В новом сеансе проверьте locale; не меняйте системную локаль сервера без согласования.
  3. Сгенерируйте нужные локалиВ Debian откройте терминал и, если пакет locales установлен, выполните sudo dpkg-reconfigure locales. В текстовом списке отметьте нужную локаль в кодировке UTF-8, например ru_RU.UTF-8 UTF-8, затем выберите локаль по умолчанию и подтвердите создание. После этого проверьте locale -a и откройте новый сеанс. Не меняйте глобальную локаль сервера без согласования, если от неё зависят службы.
  4. Задайте локаль по умолчаниюВ Debian откройте терминал и выполните locale -a; если требуемого UTF‑8 языка нет, с правами администратора установите sudo apt install locales и запустите sudo dpkg-reconfigure locales. Отметьте нужную UTF‑8 локаль, затем по необходимости sudo update-locale LANG=ru_RU.UTF-8 (только если она реально сгенерирована). Откройте новый сеанс и проверьте locale без предупреждений.
  5. Проверьте переменные в профиле и SSHЕсли предупреждение возникает только по SSH, проверьте locale на удалённой системе и настройки переменных LANG, LC_ALL в текущем сеансе (env | grep -E "^(LANG|LC_)"). Значения, передаваемые клиентом SSH, могут указывать на локаль, которой нет на сервере. Исправляйте её установкой нужной локали или настройками SSH с согласия администратора; не записывайте LC_ALL бездумно во все файлы профиля.
  6. Список доступных локалей
    Linux · Терминал (Bash)Команда
    Список доступных локалей.
    locale -a

#Генерация

Проверьте: locale и locale -a. Установите пакет и включите локали: sudo apt install locales, затем sudo dpkg-reconfigure locales и отметьте en_US.UTF-8 и ru_RU.UTF-8, выберите системную по умолчанию. Или вручную: отредактируйте /etc/locale.gen (раскомментируйте ru_RU.UTF-8 UTF-8) и выполните sudo locale-gen. Установите по умолчанию: sudo update-locale LANG=en_US.UTF-8.

#Переменные окружения

Проверьте /etc/default/locale, ~/.bashrc, ~/.profile на неверные значения LC_ALL. Для сеанса: export LC_ALL=C.UTF-8 или export LANG=en_US.UTF-8. Для SSH можно отключить передачу локали: в /etc/ssh/ssh_config на клиенте уберите SendEnv LANG LC_* или запустите ssh -o SendEnv=none. На сервере в sshd_config строка AcceptEnv LANG LC_* принимает локаль клиента.

#Контейнеры и минимальные образы

В Docker-образах Debian пакет locales обычно не установлен: добавьте RUN apt-get update && apt-get install -y locales && sed -i 's/# ru_RU.UTF-8/ru_RU.UTF-8/' /etc/locale.gen && locale-gen и ENV LANG=ru_RU.UTF-8. Для скриптов достаточно C.UTF-8, он есть в Debian по умолчанию. Проверьте результат командой locale — предупреждений быть не должно.

Linux · Терминал (Bash)С осторожностьюНужен sudo
Настройка локалей меняет системные параметры; на сервере предварительно согласуйте изменения и сохраните исходную конфигурацию.
sudo apt install locales
sudo dpkg-reconfigure locales
locale -a
locale

Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.