一、问题描述
某次Linux操作过程使用功能scp命令,后面目录无法使用Tab补全,报错:-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8): No such file or directory
相关链接:character map file ` UTF-8’ not found
二、原因处理
1)如上所示,提示是Linux字符集出了问题;
2)检查执行:locale -a ,查看了系统安装的字符编码,如下所示:没有en_US.UTF-8
localectl status #检查当前设定
System Locale: LANG=en_US.UTF-8
VC Keymap: cn
X11 Layout: cn
#重装完初始默认
localectl status #输出如下
System Locale: LANG=en_US.UTF-8
VC Keymap: us
X11 Layout: us
ls /usr/lib/locale/ #查看当前的雨具路径,显示也没有英文
C.utf8 zh_CN.gbk zh_HK.utf8 zh_SG.utf8 zh_TW.utf8
zh_CN zh_CN.utf8 zh_SG zh_TW
zh_CN.gb18030 zh_HK zh_SG.gbk zh_TW.euctw
locale #默认输出如下
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
#当前字符集
echo $LANG #输出
en_US.UTF-8
3)执行:find / -name locale*
/etc/locale.conf
/usr/include/c++/8/bits/locale_facets_nonio.h
/usr/include/c++/8/bits/locale_classes.h
/usr/include/c++/8/bits/locale_facets_nonio.tcc
/usr/include/c++/8/bits/locale_facets.h
/usr/include/c++/8/bits/localefwd.h
/usr/include/c++/8/bits/locale_classes.tcc
/usr/include/c++/8/bits/locale_facets.tcc
/usr/include/c++/8/bits/locale_conv.h
/usr/include/c++/8/locale
/usr/include/bits/types/locale_t.h
/usr/include/bits/locale.h
/usr/include/locale.h
/usr/bin/localectl
/usr/bin/localedef
/usr/bin/locale
/usr/lib64/python3.6/locale.py
/usr/lib64/python3.6/__pycache__/locale.cpython-36.opt-1.pyc
/usr/lib64/python3.6/__pycache__/locale.cpython-36.opt-2.pyc
/usr/lib64/python3.6/__pycache__/locale.cpython-36.pyc
/usr/lib/locale
/usr/share/perl5/locale.pm
/usr/share/X11/locale
/usr/share/X11/locale/locale.alias
/usr/share/X11/locale/locale.dir
/usr/share/man/man7/locale.7.gz
/usr/share/man/man1p/localedef.1p.gz
/usr/share/man/man1p/locale.1p.gz
/usr/share/man/man3p/localeconv.3p.gz
/usr/share/man/man0p/locale.h.0p.gz
/usr/share/man/man1/locale.1.gz
/usr/share/man/man1/localectl.1.gz
/usr/share/man/man1/localedef.1.gz
/usr/share/man/man3/locale.3pm.gz
/usr/share/man/man3/localeconv.3.gz
/usr/share/man/man5/locale.conf.5.gz
/usr/share/man/man5/locale.5.gz
/usr/share/locale
/usr/share/locale/locale.alias
/usr/share/bash-completion/completions/localectl
/usr/share/i18n/locales
#查询
grep -r "LC_ALL" /usr/ /etc/ #输出
/bin/dracut:export LC_ALL=C
/etc/profile.d/lang.sh: export LC_ALL
/bin/check-security-updates:export LC_ALL=C
/bin/pmdiff:export LC_ALL=POSIX
/lib/dracut/modules.d/10i18n/parse-i18n.sh: export LC_ALL
#默认
echo $LC_ALL #输出为空
echo $LC_CTYPE #也为空
4)检查,使用的是LANG=“zh_CN.UTF-8”,修改为:en_US.UTF-8
5)直接执行:export LC_CTYPE=zh_CN.UTF-8和export LC_ALL=zh_CN.UTF-8,或写入/etc/profile.d/lang.sh,验证通过:
localedef -i en_US -f UTF-8 en_US.UTF-8 #现场无效,报错:
[error] ?????????"UTF-8": ?????????
[error] ???????????"ANSI_X3.4-1968": ?????????
echo "export LC_ALL=en_US.UTF8" >> /etc/profile
source /etc/profile
6)后期又遇到类似报错,如下所示:
执行:yum check-update --security,提示如下,当前使用的是C.UTF-8
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 4:03:41 ago on Wed Sep 13 03:46:54 2023.
No security updates needed, but 179 updates available
export LC_ALL=en_US.UTF8 #报错如下
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF8): No such file or directory
-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF8)
上述报错是系统已经设置了默认地区_语言.字符集为en_US.UTF-8,但是在系统中没有定义对应的locale文件;我们需手动生成这个locale文件即可。执行:
vim /etc/environment #添加下面两行内容
LANG="en_US.UTF-8"
LC_ALL=
source /etc/environment
#生产配置文件
localedef -v -c -i en_US -f UTF-8 en_US.UTF-8 #报错如下
failed to set locale!
[error] character map file `UTF-8' not found: No such file or directory
failed to set locale!
[error] default character map file `ANSI_X3.4-1968' not found: No such file or directory
yum install glibc-langpack-zh glibc-locale-source glibc-langpack-en -y
#再次执行:
localedef -v -c -i en_US -f UTF-8 en_US.UTF-8 #输出如下
[warning] LC_NAME: field `name_gen' not defined
[warning] LC_IDENTIFICATION: field `audience' not defined
[warning] LC_IDENTIFICATION: field `application' not defined
[warning] LC_IDENTIFICATION: field `abbreviation' not defined
[verbose] LC_CTYPE: table for class "upper": 2388001817131 bytes
[verbose] LC_CTYPE: table for class "lower": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "alpha": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "digit": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "xdigit": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "space": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "print": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "graph": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "blank": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "cntrl": 18446744069414584898 bytes
[verbose] LC_CTYPE: table for class "punct": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "alnum": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "combining": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for class "combining_level3": 18446744073709551615 bytes
[verbose] LC_CTYPE: table for map "toupper": 0 bytes
[verbose] LC_CTYPE: table for map "tolower": 0 bytes
[verbose] LC_CTYPE: table for map "totitle": 0 bytes
[verbose] LC_CTYPE: table for width: 0 bytes
退出登录再次登录验证,已不再报错,如下:
执行export LC_ALL=en_US.UTF8也不再报错: