LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: flyinflash

因为对手册理解有误,所以曾经认为“手册似乎有bug”,现在我不认为“手册有bug” [已解

[复制链接]
发表于 2008-11-22 12:20:04 | 显示全部楼层
夕角提醒了我
我没注意到第一贴里有“并且不在设定其他LC_*”

不过,说LANG覆盖其他的设定,这里覆盖用错了,我真不该在这里给你上语文课,LANG是保底的,LC_ALL才是覆盖
另外,就像夕角说的,你应该搞清楚etc-update和. /etc/profile的作用。

执行命令前,可以用locale命令才查当前的locale设定
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-11-22 13:10:41 | 显示全部楼层
1、
我对 etc-update 和. /etc/profile 的理解确实有问题。因为手册说过去“更改 locale 环境变量后,不要忘记运行 etc-update && source /etc/profile ”

我在写那个脚本以前,以为自己对 locale 已经一清两楚,但是事实是不是。


2 我早上又看/测试了一下关于 locale 的东东,得出的结论是:

一 、
LANGUAGE 变量影响 GTK/GNOME/部分命令行下 程序的(信息/界面)语言

二、
不管 LC_* 如何设置,一旦设置了 LC_ALL 后,它会覆盖 LANG 和所有 LC_*
不管 LC_* 如何设置,一旦设置了 LANG 后,它会覆盖所有 LC_*

LC_* 影响与 * 相应程序的(信息/界面)语言
例如
先清空 LC_ALL 和 LANG
export LC_ALL="" && export LANG=""
设置 LC_TIME 并比较
export LC_TIME=en_US.UTF-8 && date
export LC_TIME=zh_CN.UTF-8 && date

LC_TIME 定义时间格式和语言信息,所以它会影响 date 程序。

三、
要启用 fcitx 输入法,必需设置 LC_CTYPE 为 zh_CN.* (推荐设置为 zh_CN.UTF-8)

我的第一反应是,我好像以前看过一遍文章,它的大意跟我的结论几乎一致。
http://wiki.ubuntu.com.cn/Locale ... e.E5.91.A2.EF.BC.9F


3、
得到结论2后,我发觉我改 locale 生不生交效与 一定要重启 X 没有必然联系

4、说实话,乐哥的这篇文章
http://www.linuxsir.cn/bbs/showthread.php?t=237877
我第一次看次就根本不明白它说什么,可能我接触 glibc 的时间不多,可能我太笨……

我第一次看下面那篇,对它的理解比乐哥的好一点
http://wiki.ubuntu.com.cn/Locale ... e.E5.91.A2.EF.BC.9F

5、
搞清楚一样东西最好的方法就是自己亲自测试、实践出真知,也好理解别人的文章内涵。

下午继续……
回复 支持 反对

使用道具 举报

发表于 2008-11-23 00:34:58 | 显示全部楼层
Post by flyinflash;1912011

不管 LC_* 如何设置,一旦设置了 LANG 后,它会覆盖所有 LC_*


都告诉你了是保底的
怎么还是覆盖呢?

它不会覆盖任何LC_*
它的优先级是最低的
在没有设置LC_ALL的情况下,任何没有设置的LC_*会取LANG的值
回复 支持 反对

使用道具 举报

发表于 2008-11-23 00:42:32 | 显示全部楼层
那篇文章我是发在编程区的
那里面有个我的blog的连接
那篇文章是对glibc代码的分析,用鲜活的代码告诉你事实是什么样子的
写那种具体效果的东西,谁都能写,肯定有人会写,所以我就不写了
我写那种一般人写不了的
回复 支持 反对

使用道具 举报

发表于 2008-11-23 12:19:13 | 显示全部楼层
Post by zhllg;1912266
都告诉你了是保底的
怎么还是覆盖呢?

它不会覆盖任何LC_*
它的优先级是最低的
在没有设置LC_ALL的情况下,任何没有设置的LC_*会取LANG的值

这个我也测试过,如果设置:
LANG="zh_CN.UTF-8"
LC_MESSAGES="en_US.UTF-8"         ****
env-update && soruce /etc/profile 更新之后,
用locale查看,可以看到:
LC_MESSAGES="zh_CN.UTF-8"  ****

而LC_MESSAGES正是影响很多应用程序界面的东东。


之前很迷惑,但其实zhllg说的LANG保底是正确的,请看这里:
http://www.gnu.org/software/libc ... l#Locale-Categories

之所以出现上面那种情况,是因为把 LANG 放在了 LC_MESSAGES 的上方,
也就是说,除了优先级有影响外,顺序也很重要。也正是zhllg说的:
Post by zhllg
手册里的那个表格是有些误导
LANG应该在最下面
LC_ALL应该在最上面

这么说手册有bug也算说得过去吧,应该建议修正一下,避免新手误解。


另外有关生效的问题,应该这么做:

$ sudo env-update
$ source /etc/profile                       !!非  sudo source /etc/profile !!

也就是说,env-update 必须由 root 权限执行,但 source /etc/profile 需要用户自己执行后才生效。而手册好像都是以 root 用户为范本的吧。
回复 支持 反对

使用道具 举报

发表于 2008-11-23 17:31:54 | 显示全部楼层
Post by zhou3345;1912382
这个我也测试过,如果设置:
LANG="zh_CN.UTF-8"
LC_MESSAGES="en_US.UTF-8"         ****
env-update && soruce /etc/profile 更新之后,
用locale查看,可以看到:
LC_MESSAGES="zh_CN.UTF-8"  ****

而LC_MESSAGES正是影响很多应用程序界面的东东。


之前很迷惑,但其实zhllg说的LANG保底是正确的,请看这里:
http://www.gnu.org/software/libc ... l#Locale-Categories

之所以出现上面那种情况,是因为把 LANG 放在了 LC_MESSAGES 的上方,
也就是说,除了优先级有影响外,顺序也很重要。


你也搞错了
难道只有夕角明白这个问题?
我不说
看还有谁知道为什么

简直不可思议……
回复 支持 反对

使用道具 举报

发表于 2008-11-23 18:38:59 | 显示全部楼层
没有研究过代码,只是从实际效果中总结的。
还请zhllg不吝赐教
回复 支持 反对

使用道具 举报

发表于 2008-11-23 18:42:52 | 显示全部楼层
http://www.gentoo.org/doc/zh_cn/ ... mp;chap=5#doc_chap2


env-update脚本

/etc/env.d中的好几个文件都定义了PATH变量。这并没有错:当你运行env-update的时候,它会在更新环境变量之前把这些定义都追加到PATH里,因此对于软件包(或者用户)来说将会很容易地设置他们自己的环境变量,而不影响到现有变量的值。

env-update脚本会根据/etc/env.d里文件的字母顺序来附加变量的值。这些文件名必须要以两位数字开头。

代码 2.3: env-update所用的更新顺序

         00basic        99kde-env       99local
     +-------------+----------------+-------------+
PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"

变量并不总是被串联起来,只有下列变量才会被串联:KDEDIRS、PATH、LDPATH、MANPATH、INFODIR、INFOPATH、ROOTPATH、CONFIG_PROTECT、CONFIG_PROTECT_MASK、PRELINK_PATH以及PRELINK_PATH_MASK。对于(/etc/env.d里的文件中按照字母顺序排列后)其他所有变量,最新定义的值才会被使用到。

当你运行env-update的时候,它会在文件/etc/profile.env里(会被/etc/profile使用)创建所有的环境变量。它也会从变量LDPATH中获取信息用来建立/etc/ld.so.conf。这些完成以后,它将运行ldconfig来重建动态链接器需要的文件/etc/ld.so.cache。

如果你想在运行env-update后立即看到效果,执行下面的命令来更新你的环境。自己安装过Gentoo的用户可能已经记住了这个安装指南中提到过的命令:

代码 2.4: 更新环境

# env-update && source /etc/profile

注意: 上面的命令只会更新你当前终端里的环境变量、新控制台以及它们的子程序。因此,假如你正在X11里工作,你要么在每一个你打开的终端里输入source /etc/profile,要么重新启动X,这样所有新的终端才能引用到新的变量。如果你使用了登录管理器,登陆成root然后输入/etc/init.d/xdm restart。如果不是这样,你需要注销然后重新登录回X这样才能产生使用新变量值的子程序。

重要: 你在定义其他变量时不能使用shell变量。这意味着这样的定义FOO="$BAR"(此处$BAR是另外一个变量)是不允许的。
回复 支持 反对

使用道具 举报

发表于 2008-11-24 08:21:29 | 显示全部楼层
我经常看到楼主在这打破沙锅问到底!楼主的学习精神可嘉。这个问题我当年也是不求甚解。反正不影响使用自己也就过去了。今天从头到位看了各位的帖子才明白了其中奥妙。
回复 支持 反对

使用道具 举报

发表于 2008-11-24 09:10:52 | 显示全部楼层
Post by sheep204;1912742
我经常看到楼主在这打破沙锅问到底!楼主的学习精神可嘉。这个问题我当年也是不求甚解。反正不影响使用自己也就过去了。今天从头到位看了各位的帖子才明白了其中奥妙。

不是打破沙锅问到底,他是太习惯挑别人的错误了。有这种习惯的人通常会有另一个习惯:找不到自己的错误。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表