曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3378|回复: 0
打印 上一主题 下一主题

[CentOS/RHEL] /etc/profile.d/lang.sh

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2013-5-31 13:49:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/etc/profile.d/lang.sh 会被一些初始化程序脚本程序所调用(比如 /etc/rc),它用来设置系统语言环境相关变量。下面分析一下该脚本里的内容:
[Bash shell] 纯文本查看 复制代码
sourced=0


if [ -n "$LANG" ]; then
    saved_lang="$LANG"
    [ -f "$HOME/.i18n" ] && . "$HOME/.i18n" && sourced=1
    LANG="$saved_lang"
    unset saved_lang
else
    for langfile in /etc/sysconfig/i18n "$HOME/.i18n" ; do
        [ -f $langfile ] && . $langfile && sourced=1
    done
fi


if [ "$sourced" = 1 ]; then
    [ -n "$LANG" ] && export LANG || unset LANG
    [ -n "$LC_ADDRESS" ] && export LC_ADDRESS || unset LC_ADDRESS
    [ -n "$LC_CTYPE" ] && export LC_CTYPE || unset LC_CTYPE
    [ -n "$LC_COLLATE" ] && export LC_COLLATE || unset LC_COLLATE
    [ -n "$LC_IDENTIFICATION" ] && export LC_IDENTIFICATION || unset LC_IDENTIFICATION
    [ -n "$LC_MEASUREMENT" ] && export LC_MEASUREMENT || unset LC_MEASUREMENT
    [ -n "$LC_MESSAGES" ] && export LC_MESSAGES || unset LC_MESSAGES
    [ -n "$LC_MONETARY" ] && export LC_MONETARY || unset LC_MONETARY
    [ -n "$LC_NAME" ] && export LC_NAME || unset LC_NAME
    [ -n "$LC_NUMERIC" ] && export LC_NUMERIC || unset LC_NUMERIC
    [ -n "$LC_PAPER" ] && export LC_PAPER || unset LC_PAPER
    [ -n "$LC_TELEPHONE" ] && export LC_TELEPHONE || unset LC_TELEPHONE
    [ -n "$LC_TIME" ] && export LC_TIME || unset LC_TIME
    if [ -n "$LC_ALL" ]; then
       if [ "$LC_ALL" != "$LANG" ]; then
         export LC_ALL
       else
         unset LC_ALL
       fi
    else
       unset LC_ALL
    fi
    [ -n "$LANGUAGE" ] && export LANGUAGE || unset LANGUAGE
    [ -n "$LINGUAS" ] && export LINGUAS || unset LINGUAS
    [ -n "$_XKB_CHARSET" ] && export _XKB_CHARSET || unset _XKB_CHARSET
    
    consoletype=$CONSOLETYPE
    if [ -z "$consoletype" ]; then
      consoletype=$(/sbin/consoletype stdout)
    fi


    if [ -n "$LANG" ]; then
      case $LANG in
        *.utf8*|*.UTF-8*)
        if [ "$TERM" = "linux" ]; then
            if [ "$consoletype" = "vt" ]; then
                case $LANG in 
                    ja*) LANG=en_US.UTF-8 ;;
                    ko*) LANG=en_US.UTF-8 ;;
            si*) LANG=en_US.UTF-8 ;;
                    zh*) LANG=en_US.UTF-8 ;;
                    ar*) LANG=en_US.UTF-8 ;;
                    fa*) LANG=en_US.UTF-8 ;;
                    he*) LANG=en_US.UTF-8 ;;
                    en_IN*) ;;
                    *_IN*) LANG=en_US.UTF-8 ;;
                esac
            fi
        fi
    ;;
    *)
    if [ "$TERM" = "linux" ]; then
        if [ "$consoletype" = "vt" ]; then
                case $LANG in 
                    ja*) LANG=en_US ;;
                    ko*) LANG=en_US ;;
            si*) LANG=en_US ;;
                    zh*) LANG=en_US ;;
                    ar*) LANG=en_US ;;
                    fa*) LANG=en_US ;;
                    he*) LANG=en_US ;;
                    en_IN*) ;;
                    *_IN*) LANG=en_US ;;
                esac
        fi
    fi
    ;;
      esac
    fi


    unset SYSFONTACM SYSFONT consoletype
fi
unset sourced
unset langfile

首先判断 $LANG 变量是否为非空(-n 测试变量的字符串值的长度是否为非零),如果已经设置过,那么将其值保存到 saved_lang 中。接着查看用户的家目录下是否有自定义的 .i18n 文件,如果存在,那么就执行用户的自定义配置文件,接着设立一个 sourced 标志位 1 。

在第 7 行里可以看到,用户可以自定义 i18n 其它相关的变量值,但系统预设的 $LANG 值仍然会被还原。

第 10 行,如果 $LANG 值为空,那么就会到 /etc/sysconfig/i18n  这个文件中查找相应的设置值,并且若是用户有自定义的 i18n 文件,那么仍然也会被执行。

从 16 行到 41 行 export 出相关的系统变量,如果该变量在 i18n 文件里被设置过的话,否则就 unset  掉它们。

第 43 到 46 行获取终端类型,主要涉及的命令为 consoletype

第 48 到 85 行根据 $LANG 变量,终端类型,控制台类型来设置系统语言。如果是 utf8 相关的那么就统一初始化为 en_US.UTF-8 ,否则就设置为 en_US 。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-6-2 20:39 , Processed in 0.083741 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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