sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.GB18030)
今天同事反馈说主机docker环境里面sh的时候会有这个报错,我虎躯一震,精神百倍,又是知识盲区,又可以给脑子里面上新货了。解决思路:前提:OS---Red Hat 7.6根据猜测应该是字符编码问题,先看环境变量~有这玩意,你报错我就直接拉黑你~然后source,莫得解决,不是这里的问题,root以及其他用户下执行sh,没有任何报错,奇了怪了,继续排查百度下解决方法:大家的解决方法普遍都是yum
今天同事反馈说主机docker环境里面sh的时候会有这个报错,我虎躯一震,精神百倍,又是知识盲区,又可以给脑子里面上新货了。
解决思路:
前提:OS---Red Hat 7.6
根据猜测应该是字符编码问题,先看环境变量~
有这玩意,你报错我就直接拉黑你~然后source,莫得解决,不是这里的问题,root以及其他用户下执行sh,没有任何报错,奇了怪了,继续排查
百度下解决方法:
大家的解决方法普遍都是
yum -y install kde-l10n-Chinese telnet &&
yum -y reinstall glibc-common
#基本就能搞定 ,还有修改一下
/etc/locale.conf LC_ALL="zh_CN.UTF-8"
照着百度整一遍,好像也是莫得反应,当然我这里的zh_CN.UTF-8换成了我们的报错内容:zh_CN.GB18030。
接着与其他docker环境做对比,发现其他docker环境也有类似问题,由此可见这玩意不会影响执行,只不过可能对汉字就不是很友好了。
继续,要做先驱者。
locale命令看下:(将有关当前语言环境或全部公共语言环境的信息写到标准输出上)-通俗理解就是打印当前所有的语言环境。
可以看出当前环境是有报错这个语言环境的
重点介绍下:(知识点~~~)
-
LANG:LANG的优先级是最低的,它是所有LC_*变量的默认值,下方所有以LC_开头变量(LC_ALL除外)中,如果存在没有设置变量值的变量,那么系统将会使用LANG的变量值来给这个变量进行赋值。如果变量有值,则保持不变
-
LC_ALL:它不是环境变量,它是一个宏,它可通过该变量的设置覆盖所有LC_*变量,这个变量设置之后,可以废除LC_*的设置值,使得这些变量的设置值与LC_ALL的值一致,注意LANG变量不受影响。
-
优先级:LC_ALL > LC_* > LANG
那因为点啥呢?那就看他的配置文件:
1、locale默认文件存放位置: /usr/share/i18n/locales (这里locale -a也可直接查看当前系统所有可用 )
2、设置locale在下面几个路径
一、可以修改系统环境变量,/etc/profile----不适合我,记得source
export LC_ALL=zh_CN.utf8
export LANG=zh_CN.utf8
二、修改/etc/locale.gen文件,当前OS莫得此文件,改完记得 locale-gen 命令使其生效
三、命令行模式
localectl set-locale LANG=en_US.UTF-8
四、/etc/locale.conf
在此处添加了,好像这玩意也没啥作用,后面注释掉了
五、也是用此方法解决了
localedef -c -f UTF-8 -i zh_CN zh_CN.GB18030
没太明白意思,就看了下帮助以及使用,这里有input 和output
usage这里有打印列表,localedef --list-archive
好像是加了这玩意,shell才能识别这个编码格式了,好神奇~
localedef :
转化语言环境和字符集描述(charmap)源文件以生成语言环境数据库。
行了,问题解决了,我就打住了。
更多推荐
所有评论(0)