setlocale warning
使用mac上面iterm2一段时间了,登陆服务器老是报如下warning
warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
然后yum 安装的时候也会报LC_CTYPE环境变量的问题。于是抽空搜索了一下,找到了如下文章http://www.cyberciti.biz/faq/os-x-terminal-bash-warning-setlocale-lc_ctype-cannot-change-locale/
文章给出了3个解决方案:
1. ssh client关掉 Set locale environment variables on startup。
2. sudo vi ~/.ssh/config 将#SendEnv LANG LC_* 给注释掉。
3. localedef -i en_US -f UTF-8 en_US.UTF-8
前2个我都试过了,是ok 的,关键是理解why为什么。其实ssh 连的时候他会传递环境变量,这个变量如在服务器没有本地的环境,就会报这个错误。我确认了一下,其实就是$LC_CTYPE 这个环境变量导致的。
在mac的环境变量LC_CTYPE=UTF-8
imac:~ aca$ echo $LC_CTYPE
UTF-8
imac:~ aca$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=
不传LC参数登陆服务器
在服务器上面LC_CTYPE=”en_US.UTF-8”
[root@iZ28ywqw7nhZ opt]# 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=
[root@iZ28ywqw7nhZ opt]# echo $LC_CTYPE
传LC参数登陆服务器
[[email protected] ~]# echo "$LC_CTYPE"
UTF-8
[[email protected] ~]# locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=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=
传参数导致服务器上面的LC_CTYPE=UTF-8了。
可以看到注意是LC_CTYPE这个参数,mac上面是UTF-8,服务器上面识别不了UTF-8,一般都是”en_US.UTF-8” ,所以会报cannot change locale (UTF-8): No such file or directory 这个warning 。原因在此。