scp tab补全报错:F-bash: warning: setlocale: LC_CTYPE: cannot change locale (en_US.UTF-8)

本文讲述了在Linux环境下,使用scp命令时遇到Tab补全失败的报错,原因是字符集设置不正确。作者逐步排查并解决该问题,涉及locale设置、locale文件生成等步骤。
摘要由CSDN通过智能技术生成

一、问题描述

某次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也不再报错:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羌俊恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值