locale命令用于查看和设置Linux系统的区域设置(locale),这些设置决定了系统的语言、字符编码、货币格式、时间格式等本地化信息。
locale是Linux系统中用于定义语言、地区、字符编码等本地化信息的配置。它影响:
locale名称的格式通常为:
语言_地区.字符集@修饰符
| 命令 | 说明 |
|---|---|
locale |
查看当前locale设置 |
locale -a |
查看系统支持的所有locale |
locale -m |
查看系统支持的所有字符集 |
locale -k 关键字 |
查看指定locale的详细信息 |
localectl |
系统区域设置控制工具(systemd) |
locale-gen |
生成locale(Debian/Ubuntu) |
update-locale |
更新locale配置(Debian/Ubuntu) |
# 1. 查看当前locale设置(最常用)
locale
# 输出示例:
# LANG=zh_CN.UTF-8
# LC_CTYPE="zh_CN.UTF-8"
# LC_NUMERIC="zh_CN.UTF-8"
# LC_TIME="zh_CN.UTF-8"
# LC_COLLATE="zh_CN.UTF-8"
# LC_MONETARY="zh_CN.UTF-8"
# LC_MESSAGES="zh_CN.UTF-8"
# LC_PAPER="zh_CN.UTF-8"
# LC_NAME="zh_CN.UTF-8"
# LC_ADDRESS="zh_CN.UTF-8"
# LC_TELEPHONE="zh_CN.UTF-8"
# LC_MEASUREMENT="zh_CN.UTF-8"
# LC_IDENTIFICATION="zh_CN.UTF-8"
# LC_ALL=
# 2. 查看系统支持的所有locale
locale -a
# 3. 查看系统支持的所有字符集
locale -m
# 4. 查看特定locale的详细信息
locale -k LC_CTYPE
locale -k LC_TIME
# 5. 查看特定locale的所有信息
LANG=zh_CN.UTF-8 locale -k LC_TIME
# 6. 显示locale的字符映射表
locale charmap
# 7. 显示当前语言的月份名称
locale month
# 8. 显示当前语言的星期名称
locale day
| 环境变量 | 说明 | 示例值 |
|---|---|---|
LANG |
默认区域设置(其他未设置变量的默认值) | zh_CN.UTF-8 |
LC_ALL |
最高优先级,覆盖所有其他locale设置 | en_US.UTF-8 |
LC_CTYPE |
字符分类和大小写转换 | zh_CN.UTF-8 |
LC_NUMERIC |
数字格式(小数点、千分位) | en_US.UTF-8 |
LC_TIME |
时间和日期格式 | zh_CN.UTF-8 |
LC_COLLATE |
排序和比较规则 | en_US.UTF-8 |
LC_MONETARY |
货币格式 | zh_CN.UTF-8 |
LC_MESSAGES |
系统消息语言 | zh_CN.UTF-8 |
LC_PAPER |
纸张大小标准 | zh_CN.UTF-8 |
LC_NAME |
姓名格式 | zh_CN.UTF-8 |
LC_ADDRESS |
地址格式 | zh_CN.UTF-8 |
LC_TELEPHONE |
电话号码格式 | zh_CN.UTF-8 |
LC_MEASUREMENT |
度量单位 | zh_CN.UTF-8 |
LC_IDENTIFICATION |
locale元数据 | zh_CN.UTF-8 |
LC_ALL > LC_* > LANG
如果设置了LC_ALL,它将覆盖所有其他locale设置。如果LC_ALL未设置,则使用对应的LC_*变量,如果LC_*也未设置,则使用LANG的值。
如果locale -a中没有需要的locale,需要先生成:
# 1. 编辑locale配置文件
sudo vi /etc/locale.gen
# 2. 取消注释需要的locale
# 例如,启用中文支持:
zh_CN.UTF-8 UTF-8
zh_CN.GBK GBK
zh_CN.GB2312 GB2312
en_US.UTF-8 UTF-8
# 3. 生成locale
sudo locale-gen
# 4. 更新系统locale
sudo update-locale LANG=zh_CN.UTF-8
# 5. 查看生成的locale
locale -a | grep zh_CN
# 1. 查看可用的locale
localectl list-locales
# 2. 设置系统locale
sudo localectl set-locale LANG=zh_CN.UTF-8
# 3. 生成特定locale
sudo localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
# 4. 或者编辑配置文件
sudo vi /etc/locale.conf
# 添加:LANG="zh_CN.UTF-8"
# 5. 使配置生效
source /etc/locale.conf
# 1. 手动生成locale
sudo locale-gen zh_CN.UTF-8
# 2. 或者使用localedef
sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8
# 3. 验证是否生成成功
locale -a | grep zh_CN
# 4. 临时设置locale(仅当前会话)
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# 1. 编辑全局locale配置文件
sudo vi /etc/default/locale # Debian/Ubuntu
sudo vi /etc/locale.conf # CentOS/RHEL/Fedora
sudo vi /etc/sysconfig/i18n # 旧版RHEL
# 2. 添加以下内容
LANG="zh_CN.UTF-8"
LC_ALL="zh_CN.UTF-8"
# 3. 或者只设置LANG(推荐)
LANG="zh_CN.UTF-8"
# 4. 使配置生效
source /etc/default/locale # 当前会话生效
# 重启后永久生效
# 1. 查看当前系统locale设置
localectl status
# 2. 设置系统locale
sudo localectl set-locale LANG=zh_CN.UTF-8
# 3. 设置特定locale
sudo localectl set-locale LC_CTYPE=zh_CN.UTF-8
sudo localectl set-locale LC_TIME=en_US.UTF-8
# 4. 同时设置多个
sudo localectl set-locale LANG=zh_CN.UTF-8 LC_CTYPE=zh_CN.UTF-8 LC_TIME=en_US.UTF-8
# 5. 查看生效的配置
localectl
# 1. 编辑用户shell配置文件
vi ~/.bashrc # bash用户
vi ~/.zshrc # zsh用户
vi ~/.profile # 所有shell
# 2. 添加以下行
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# 3. 使配置生效
source ~/.bashrc
# 4. 验证配置
locale
echo $LANG
zh_CN.UTF-8 - 简体中文,UTF-8编码(推荐)zh_CN.GBK - 简体中文,GBK编码zh_CN.GB2312 - 简体中文,GB2312编码zh_CN.GB18030 - 简体中文,GB18030编码zh_TW.UTF-8 - 繁体中文(台湾)zh_HK.UTF-8 - 繁体中文(香港)zh_SG.UTF-8 - 简体中文(新加坡)en_US.UTF-8 - 英文(美国),UTF-8编码en_GB.UTF-8 - 英文(英国)en_AU.UTF-8 - 英文(澳大利亚)ja_JP.UTF-8 - 日文(日本)ko_KR.UTF-8 - 韩文(韩国)fr_FR.UTF-8 - 法文(法国)de_DE.UTF-8 - 德文(德国)ru_RU.UTF-8 - 俄文(俄罗斯)C或POSIX是默认的最小locale,使用ASCII字符集,是最基本的配置。许多服务器为了性能和兼容性使用C locale。
#!/bin/bash
# 解决中文乱码问题
# 文件名:fix_chinese_locale.sh
echo "正在检查当前locale设置..."
locale
echo -e "\n检查是否支持中文locale..."
locale -a | grep -E "zh_CN|zh_TW|zh_HK"
# 如果未安装中文locale,尝试安装
if ! locale -a | grep -q "zh_CN.UTF-8"; then
echo "未找到中文locale,尝试安装..."
# 检测系统类型
if [ -f /etc/debian_version ]; then
# Debian/Ubuntu系统
echo "安装中文locale(Debian/Ubuntu)..."
sudo sed -i '/zh_CN.UTF-8/s/^#//g' /etc/locale.gen
sudo locale-gen
sudo update-locale LANG=zh_CN.UTF-8
elif [ -f /etc/redhat-release ]; then
# CentOS/RHEL/Fedora系统
echo "安装中文locale(CentOS/RHEL)..."
sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8
sudo localectl set-locale LANG=zh_CN.UTF-8
fi
fi
echo -e "\n临时设置中文locale(当前会话有效)..."
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
echo -e "\n永久设置中文locale..."
if [ -f ~/.bashrc ]; then
echo "写入 ~/.bashrc"
echo 'export LANG=zh_CN.UTF-8' >> ~/.bashrc
echo 'export LC_ALL=zh_CN.UTF-8' >> ~/.bashrc
fi
echo -e "\n重新加载配置..."
source ~/.bashrc 2>/dev/null || true
echo -e "\n验证设置..."
locale
echo -e "\n测试中文显示:"
echo "中文测试" | iconv -f UTF-8 -t GBK 2>/dev/null || echo "无法转换编码"
echo -e "\n完成!如果仍有乱码,请重启终端或系统。"
#!/bin/bash
# 批量设置服务器locale
# 文件名:batch_set_locale.sh
# 服务器列表
SERVERS=("server1.example.com" "server2.example.com" "server3.example.com")
USER="root"
LOCALE="en_US.UTF-8"
echo "开始批量设置服务器locale为: $LOCALE"
for SERVER in "${SERVERS[@]}"; do
echo -e "\n===== 处理服务器: $SERVER ====="
# 检查服务器连通性
if ! ping -c 1 -W 2 "$SERVER" &> /dev/null; then
echo "服务器 $SERVER 不可达,跳过"
continue
fi
# SSH连接并执行命令
ssh -o ConnectTimeout=5 "$USER@$SERVER" "
echo '当前locale设置:'
locale
echo -e '\n正在设置locale...'
# 检查系统类型并设置
if [ -f /etc/debian_version ]; then
# Debian/Ubuntu
sed -i '/$LOCALE/s/^#//g' /etc/locale.gen 2>/dev/null || true
locale-gen 2>/dev/null || true
update-locale LANG=$LOCALE 2>/dev/null || true
elif [ -f /etc/redhat-release ]; then
# CentOS/RHEL/Fedora
localectl set-locale LANG=$LOCALE 2>/dev/null || true
echo 'LANG=$LOCALE' > /etc/locale.conf 2>/dev/null || true
fi
# 临时设置当前会话
export LANG=$LOCALE
export LC_ALL=$LOCALE
echo -e '\n设置后的locale:'
locale
echo -e '\n重启后生效,建议重启相关服务。'
" 2>&1 | sed "s/^/[$SERVER] /"
if [ ${PIPESTATUS[0]} -eq 0 ]; then
echo "服务器 $SERVER 设置成功"
else
echo "服务器 $SERVER 设置失败"
fi
done
echo -e "\n批量设置完成"
#!/bin/bash
# 检查和修复损坏的locale
# 文件名:check_fix_locale.sh
echo "========== 检查locale配置 =========="
# 检查当前设置
echo "1. 当前locale设置:"
locale 2>&1 | tee /tmp/locale_check.log
# 检查是否有错误
echo -e "\n2. 检查错误信息:"
if locale 2>&1 | grep -q "warning\|error\|Cannot set"; then
echo "发现locale错误,开始修复..."
# 备份现有配置
echo "备份当前配置..."
cp /etc/default/locale /etc/default/locale.bak 2>/dev/null || true
cp /etc/locale.conf /etc/locale.conf.bak 2>/dev/null || true
cp ~/.bashrc ~/.bashrc.bak 2>/dev/null || true
# 生成基本locale
echo "生成基本locale..."
locale-gen en_US.UTF-8 2>/dev/null || true
locale-gen C.UTF-8 2>/dev/null || true
# 重置为简单配置
echo "重置locale配置..."
echo "LANG=en_US.UTF-8" | sudo tee /etc/default/locale > /dev/null 2>&1 || true
echo "LANG=en_US.UTF-8" | sudo tee /etc/locale.conf > /dev/null 2>&1 || true
# 清理用户配置中的错误行
if [ -f ~/.bashrc ]; then
echo "清理 ~/.bashrc 中的locale设置..."
sed -i '/export LANG=/d' ~/.bashrc
sed -i '/export LC_/d' ~/.bashrc
sed -i '/export LC_ALL=/d' ~/.bashrc
echo 'export LANG=en_US.UTF-8' >> ~/.bashrc
fi
# 应用新设置
echo "应用新设置..."
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
source ~/.bashrc 2>/dev/null || true
echo -e "\n修复后的locale设置:"
locale
else
echo "未发现明显错误。"
fi
# 检查支持的所有locale
echo -e "\n3. 系统支持的locale:"
locale -a 2>/dev/null | head -20
# 检查字符集
echo -e "\n4. 系统支持的字符集:"
locale -m 2>/dev/null | head -10
echo -e "\n========== 检查完成 =========="
echo "详细日志:/tmp/locale_check.log"
# 错误:locale: Cannot set LC_CTYPE to default locale: No such file or directory
# 原因:指定的locale在系统中不存在
# 解决方案:
# 1. 检查系统支持的locale
locale -a
# 2. 如果缺少需要的locale,生成它
# Debian/Ubuntu:
sudo locale-gen zh_CN.UTF-8
# CentOS/RHEL:
sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8
# 3. 临时使用存在的locale
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
# 4. 永久修改配置文件
# 编辑/etc/default/locale或/etc/locale.conf
# 使用存在的locale名称
# 问题:SSH连接后locale恢复为默认,不是服务器设置的值
# 原因:SSH客户端会传递自己的locale设置
# 解决方案:
# 1. 在SSH服务器端配置(/etc/ssh/sshd_config)
AcceptEnv LANG LC_*
# 2. 重启SSH服务
sudo systemctl restart sshd
# 3. 或者在客户端不发送locale设置
# 修改~/.ssh/config或/etc/ssh/ssh_config
SendEnv -LANG
# 4. 在服务器上强制设置
# 编辑/etc/environment
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
# 5. 修改PAM配置
# 编辑/etc/pam.d/sshd或/etc/pam.d/login
# 添加:session required pam_env.so readenv=1 envfile=/etc/environment
# 问题:中文字符显示为乱码(菱形、问号等)
# 原因:终端编码与系统locale不匹配
# 解决方案:
# 1. 检查当前locale
locale
# 2. 设置正确的locale
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# 3. 检查终端编码设置
# 在终端设置中选择UTF-8编码
# 4. 对于特定程序,设置其编码
# 对于vim:
echo "set encoding=utf-8" >> ~/.vimrc
# 5. 转换文件编码
# 将GBK文件转换为UTF-8
iconv -f GBK -t UTF-8 input.txt -o output.txt
# 6. 检查字体是否支持中文
# 安装中文字体
# Debian/Ubuntu:
sudo apt-get install fonts-wqy-zenhei
# CentOS/RHEL:
sudo yum install wqy-zenhei-fonts
# 错误:bash: locale: command not found
# 原因:最小化安装未包含locale命令或glibc-locales包
# 解决方案:
# 1. 安装locale工具
# Debian/Ubuntu:
sudo apt-get update
sudo apt-get install locales
# CentOS/RHEL:
sudo yum install glibc-common
# Alpine Linux:
apk add musl-locales
# 2. 验证安装
which locale
locale --version
# 3. 如果仍然找不到,检查PATH
echo $PATH
# 通常在/usr/bin/locale
# 4. 使用替代方法查看locale
echo $LANG
echo $LC_ALL
cat /etc/default/locale 2>/dev/null || cat /etc/locale.conf 2>/dev/null
localectl - systemd系统区域设置控制locale-gen - 生成locale数据update-locale - 更新locale配置localedef - 编译locale定义iconv - 字符编码转换tzselect - 选择时区timedatectl - 系统时间和日期控制env - 显示环境变量export - 设置环境变量source - 执行配置文件en_US.UTF-8,避免中文乱码问题zh_CN.UTF-8