#Что означает ошибка
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. |
#Пошаговое решение
- Проверьте locale и locale -aОткройте терминал Debian и выполните
localeиlocale -a. Запишите значение, указанное после предупрежденияsetlocale: cannot change locale, затем проверьте его наличие среди установленных вариантов с.utf8/.UTF-8. Если отсутствует, установите пакет locales и запустите штатную настройку, а не удаляйте пользовательский профиль. - Установите пакет 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; не меняйте системную локаль сервера без согласования. - Сгенерируйте нужные локалиВ Debian откройте терминал и, если пакет
localesустановлен, выполнитеsudo dpkg-reconfigure locales. В текстовом списке отметьте нужную локаль в кодировке UTF-8, напримерru_RU.UTF-8 UTF-8, затем выберите локаль по умолчанию и подтвердите создание. После этого проверьтеlocale -aи откройте новый сеанс. Не меняйте глобальную локаль сервера без согласования, если от неё зависят службы. - Задайте локаль по умолчаниюВ Debian откройте терминал и выполните
locale -a; если требуемого UTF‑8 языка нет, с правами администратора установитеsudo apt install localesи запуститеsudo dpkg-reconfigure locales. Отметьте нужную UTF‑8 локаль, затем по необходимостиsudo update-locale LANG=ru_RU.UTF-8(только если она реально сгенерирована). Откройте новый сеанс и проверьтеlocaleбез предупреждений. - Проверьте переменные в профиле и SSHЕсли предупреждение возникает только по SSH, проверьте
localeна удалённой системе и настройки переменныхLANG,LC_ALLв текущем сеансе (env | grep -E "^(LANG|LC_)"). Значения, передаваемые клиентом SSH, могут указывать на локаль, которой нет на сервере. Исправляйте её установкой нужной локали или настройками SSH с согласия администратора; не записывайтеLC_ALLбездумно во все файлы профиля. - Список доступных локалей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 — предупреждений быть не должно.
sudo apt install localessudo dpkg-reconfigure localeslocale -alocaleКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.