Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1365491
  • 博文数量: 245
  • 博客积分: 10021
  • 博客等级: 上将
  • 技术积分: 3094
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-12 14:51
文章存档

2011年(2)

2009年(152)

2008年(91)

我的朋友

分类:

2009-01-15 13:46:47

环境变数的功能

环境变数可以帮我们达到很多功能~包括家目录的变换啊、提示字元的显示啊、执行档搜寻的路径啊等等的, 还有很多很多啦!那么,既然环境变数有那么多的功能,问一下,目前我的 shell 环境中, 有多少变数啊?!呵呵!我们可以利用两个指令来查阅,分别是 env 与 export 呢!

# 一些环境变数的说明: env

范例一:列出目前的 shell 环境下的所有环境变数与其内容。
[root@linux ~]# env
HOSTNAME=linux.dmtsai.tw   <== 这部主机的主机名称
SHELL=/bin/bash            <== 目前这个环境下,使用的 Shell 是哪一个程式?
TERM=xterm                 <== 这个终端机使用的环境是什么类型
HISTSIZE=1000              <== 这个就是‘记录指令的笔数’在 FC4 预设可记录 1000 笔
USER=root                  <== 使用者的名称啊!
LS_COLORS=no=00:fi=00:di=00;34:ln=00;36:pi=40;33:so=00;35:bd=40;33;01:cd=40;33;01:
or=01;05;37;41:mi=01;05;37;41:ex=00;32:*.cmd=00;32:*.exe=00;32:*.com=00;32:*.btm=0
0;32:*.bat=00;32:*.sh=00;32:*.csh=00;32:*.tar=00;31:*.tgz=00;31:*.arj=00;31:*.taz=
00;31:*.lzh=00;31:*.zip=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.bz=00;3
1:*.tz=00;31:*.rpm=00;31:*.cpio=00;31:*.jpg=00;35:*.gif=00;35:*.bmp=00;35:*.xbm=00
;35:*.xpm=00;35:*.png=00;35:*.tif=00;35: <== 一些颜色显示
ENV=/root/.bashrc          <== 使用的个人环境设定档
MAIL=/var/spool/mail/root  <== 这个使用者所取用的 mailbox 位置
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:
/root/bin                  <== 不再多讲啊!是执行档指令搜寻路径
INPUTRC=/etc/inputrc       <== 与键盘按键功能有关。可以设定特殊按键!
PWD=/root                  <== 目前使用者所在的工作目录 (利用 pwd 取出!)
LANG=en_US.UTF-8           <== 这个与语系有关,底下会再介绍!
HOME=/root                 <== 这个使用者的家目录啊!
_=/bin/env                 <== 上一次使用的指令的最后一个参数(或指令本身)

env 是 environment (环境) 的简写啊~ 上面的例子当中,是列出来所有的环境变数。当然,如果使用 export 也会是一样的内容~ 只不过, export 还有其他额外的功能就是了,我们等一下再提这个 export 指令。 那么上面这些变数有些什么功用呢?底下我们就一个一个来分析分析!

    * HOME : 代表使用者的家目录。还记得我们可以使用 cd ~ 去到使用者的家目录吗?或者利用 cd 就可以直接回到使用者家目录了。那就是取用这个功能啦~ 有很多程式都可能会取用到这个变数的值喔!

    * SHELL : 告知我们,目前这个环境使用的 SHELL 是哪支程式? 如果是 bash 的话,预设是 /bin/bash 的啦!

    * HISTSIZE : 这个与‘历史命令’有关,亦即是, 我们曾经下达过的指令可以被系统记录下来,而记录的‘笔数’则是由这个值来设定的。

    * ENV : 这个使用者所使用的个人化环境设定档的读取档案。

    * MAIL : 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱档案 (mailbox)。

    * PATH : 就是执行档搜寻的路径啦~目录与目录中间以冒号(:)分隔, 由于档案的搜寻是依序由 PATH 的变数内的目录来查询,所以,目录的顺序也是重要的喔。

    * LANG : 这个重要!就是语系档案啰~很多资料都会用到他, 举例来说,当我们在启动某些 perl 的程式语言档案时,他会主动的去分析语系资料档案, 如果发现有他无法解析的编码语系,可能会产生错误喔!一般来说,我们中文编码通常是 zh_TW.Big5 或者是 zh_TW.UTF-8,这两个编码偏偏不容易被解译出来,所以,有的时候,可能需要修订一下语系资料。 这部分我们会在下个小节做介绍的!

    * RANDOM : 这个玩意儿就是‘随机乱数’的变数啦!目前大多数的 distributions 都会有乱数产生器,那就是 /dev/random 这个档案。 我们可以透过这个乱数档案相关的变数 ($RANDOM) 来随机取得乱数值喔。在 BASH 的环境下,这个 RANDOM 变数的内容,介于 0~32767 之间,所以,你只要 echo $RANDOM 时,系统就会主动的随机取出一个介于 0~32767 的数值。万一我想要使用 0~9 之间的数值呢?呵呵~利用 declare 宣告数值类型, 然后这样做就可以了:

      [root@linux ~]# declare -i number=$RANDOM*10/32767 ; echo $number
      8   <== 此时会随机取出 0~9 之间的数值喔!

大致上是有这些环境变数啦~里面有些比较重要的参数,在底下我们都会另外进行一些说明的~
# 其他所有的变数说明: set
而除了这些环境变数之外,还有没有什么重要的变数呢?当然有啊! 我们在 bash 的环境下,其实还有一些挺重要的变数,这些变数是‘在这个 shell 环境下有效’的, 如果是在‘子程序’,这些变数值就不会相同了。 那么如何观察目前 shell 环境下的所有变数呢?很简单啊,就用 set 即可!set 这个指令除了会将环境变数列出来之外,其他我们的自订变数,与所有的变数,都会被列出来喔!资讯多好多。 底下仅列出几个重要的内容。

[root@linux ~]# set
BASH=/bin/bash           <== bash 的主程式放置路径
BASH_VERSINFO=([0]="3" [1]="00" [2]="16" [3]="1" [4]="release"
[5]="i386-redhat-linux-gnu")      <== bash 的版本啊!
BASH_VERSION='3.00.16(1)-release' <== bash 的版本啊!
COLORS=/etc/DIR_COLORS.xterm      <== 使用的颜色纪录档案
COLUMNS=115              <== 在目前的终端机环境下,使用的栏位有几个字元长度
HISTFILE=/root/.bash_history      <== 历史命令记录的放置档案,隐藏档
HISTFILESIZE=1000        <== 存起来(与上个变数有关)的档案之指令的最大纪录笔数。
HISTSIZE=1000            <== 目前环境下,可记录的历史命令最大笔数。
HOSTTYPE=i386            <== 主机安装的软体主要类型。我们用的是 i386 相容机器软体
IFS=$' \t\n'             <== 预设的分隔符号
LINES=35                 <== 目前的终端机下的最大行数
MACHTYPE=i386-redhat-linux-gnu    <== 安装的机器类型
MAILCHECK=60             <== 与邮件有关。每 60 秒去扫瞄一次信箱有无新信!
OLDPWD=/home             <== 上个工作目录。我们可以用 cd - 来取用这个变数。
OSTYPE=linux-gnu         <== 作业系统的类型!
PPID=20046               <== 父程序的 PID (会在后续章节才介绍)
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/~}\007"'
                         <== 上面这个是命令提示字元!与底下也有关。
PS1='[\u@\h \W]\$ '      <== PS1 就厉害了。这个是命令提示字元,也就是我们常见的
                             [root@linux ~]# 或 [dmtsai ~]$ 的设定值啦!可以更动的!
RANDOM=13586             <== 乱数啊!上面已经提过啰~
SUPPORTED=zh_TW.UTF-8:zh_TW:zh:en_US.UTF-8 <== 本系统所支援的语系
name=VBird               <== 刚刚设定的自订变数也可以被列出来喔!
$                        <== 目前这个 shell 所使用的 PID
?                        <== 刚刚执行完指令的回传值。

一般来说,不论是否为环境变数,只要跟我们目前这个 shell 的操作介面有关的变数, 通常都会被设定为大写字元,也就是说,‘基本上,在 Linux 预设的情况中,使用{大写的字母}来设定的变数一般为系统内定需要的变数’。

使用 set 除了会将系统的预设值秀出来之外,连带的所有的你自己设定的变数也会被秀出来! 同时需要注意的是,若当时有相当多人同时在线上的话,那么 你的变数只能给自己使用 ( 除非改的是系统的预设参数档,如 /etc/profile ),而不会干扰到别人的!就如同前面所说的, 由于你登入 Linux 之后会取得一个 PID ,而你的设定将只对这个 PID 与子程序有关!此外, 这次登入所进行的变数设定,如果没有更动到设定档, 那么这次设定的变数在下次登入时将被取消掉 ( 因为程序 PID 不见啰! ) !所以啰, 如果你想要你的变数每次都能在你登入的时候自动就设定好了,那么就必须将你的设定写入登入时载入的设定档! ( 更多的程序相关的说明,不要急~我们会在后面的 程序与资源管理 当中好好的提一提的! )

OK!OK!那么上头那些变数当中,有哪些是比较重要的?大概有这几个吧!

    * PS1:(提示字元的设定)

      这是 PS1 (数字的 1 不是英文字母!),这个东西就是我们的‘命令提示字元’啊! 当我们每次按下 [Enter] 按键去执行某个指令后,最后要再次出现提示字元时, 就会主动去读取这个变数值了。上头 PS1 内显示的是一些特殊符号,每个版本 bash 的 PSI 变数内的特殊符号可能有些许的差异, 你应该主动的以 man bash 去查询一下相关的变数。底下我列出 FC4 的环境下, 预设的 bash 的 PS1 变数内的特殊符号代表意义:

          o \d :代表日期,格式为 Weekday Month Date,例如 "Mon Aug 1"
          o \H :完整的主机名称。举例来说,鸟哥的练习机 linux.dmtsai.tw ,那么这个主机名称就是 linux.dmtsai.tw
          o \h :仅取主机名称的第一个名字。以上述来讲,就是 linux 而已, .dmtsai.tw 被省略。
          o \t :显示时间,为 24 小时格式,如: HH:MM:SS
          o \T :显示时间,12 小时的时间格式!
          o \A :显示时间,24 小时格式, HH:MM
          o \u :目前使用者的帐号名称;
          o \v :BASH 的版本资讯;
          o \w :完整的工作目录名称。家目录会以 ~ 取代;
          o \W :利用 basename 取得工作目录名称,所以仅会列出最后一个目录名。
          o \# :下达的第几个指令。
          o \$ :提示字元,如果是 root 时,提示字元为 # ,否则就是 $ 啰~

      OK!所以,由预设的 PS1 内容为: '\[\u@\h \W\]\$ ' 就可以瞭解为何我们的提示字元会是: [root@linux ~]# 了吧!好了,那么假设我想要有类似底下的提示字元:

            [root@linux /home/dmtsai 16:50 #12]#
      ,那个 # 代表第 12 次下达的指令。 那么应该如何设定 PS1 呢?可以这样啊:

      [root@linux home]# PS1='[\u@\h \w \A #\#]\$ '
      [root@linux /home 17:02 #85]#
      # 看到了吗?提示字元变了!变的很有趣吧!其中,那个 #85 比较有趣,
      # 如果您按下 [Enter] 后,该数字就会增加喔!为啥?上面有说明ㄇㄟ!


    * $:(关于本 shell 的 PID)

      其实这个咚咚代表的是‘目前这个 Shell 的执行绪代号’,亦即是所谓的 PID (Process ID)。 更多的程序观念,我们会在第四章的时候提及。想要知道我们的 shell 的 PID ,就可以: echo $$ 即可!

    * ?:(关于上个执行指令的回传码)

      虾密?问号也是一个特殊的变数?没错!在 bash 里面这个变数可重要的很! 这个变数是:‘上个执行的指令所回传的值’, 上面这句话的重点是‘上一个指令’与‘回传值’两个地方。当我们执行某些指令时, 这些指令都会回传一个执行后的代码。一般来说,如果成功的执行该指令, 则会回传一个 0 值,如果执行过程发生错误,就会回传‘错误代码’才对!一般就是以非为 0 的数值来取代。 我们以底下的例子来看看:

      [root@linux ~]# echo $SHELL
      /bin/bash
      [root@linux ~]# echo $?
      0
      # 因为上个指令执行过程中,并没有错误,为成功的执行完毕,所以回传 0 。
      [root@linux ~]# 12name=VBird
      -bash: 12name=VBird: command not found
      [root@linux ~]# echo $?
      127
      # 发生错误啦!所以 echo $? 时,就会出现错误的代码!
      # 我们可以利用这个代码来搜寻错误的原因喔!
      [root@linux ~]# echo $?
      0
      # 咦!怎么又变成正确了?这是因为 "?" 只与‘上一个执行指令’有关,
      # 所以,我们上一个指令是执行‘ echo $? ’,当然没有错误,所以是 0 没错!


    * OSTYPE, HOSTTYPE, MACHTYPE:(主机硬体与核心的等级)

      这几个东西与程式的安装有关。我们在‘Linux 主机规划’ 里面提到过关于主机的等级方面的问题,当我们在安装软体的时候, 需要透过编译器来将原始码编译成为二进位的档案 (binary file)。但是, 我们可以针对硬体的配备来进行编译的最佳化,此时,这些参数就可以被用到了! 基本上,目前主要的 distribution 都是针对 i386 亦即最低等级的机器进行最佳化, 这样才能够安装在较高阶的机器上,如果以 686 的机型来最佳化, 那么,可就无法向下相容的喔!(早期的 OpenLinux 是针对 686 机器来释出软体, 所以,当时的 OpenLinux 是无法安装在 P-166 的机器上的。 )

自订变数转成环境变数: export

好了,上面我们环境变数也提过了,一些自订变数也提过了,那么,这两者有啥不同? 他的不同处,我们在 变数设定规则 当中稍微提过, 主要是由于变数可否被子程序所引用。

当你取得一个 bash 之后,亦即得到了一个程序了,但是若你再次的执行一次 bash ,那么你将进入‘子程序’,这个程序的概念我们在资源管理章节中再详谈,这里您先有个概念即可。 那么由于您已经进入了该子程序,所以在父程序中的自订变数设定将不再继续的存在。 会存在子程序中的,仅有‘环境变数’。

换个角度来想,也就是说,如果我能将自订变数变成环境变数的话,那不就可以让该变数值继续存在于子程序了? 呵呵!没错!此时,那个 export 指令就很有用啦! 如您想要让该变数内容继续的在子程序中使用,那么就请执行:

      export 变数(输出变量到父进程,将自定义变量变成环境变量。)

这个东西用在‘引用他人的档案或者其他程序’时,相当的重要的! 尤其像鸟哥常常两三个档案互相引用来引用去的,如果忘记设定 export 的话,那么不同的档案中的相同变数值,将需要一再地重复设定才行!所以,我只要在头一个档案使用 export 的话,那么后续的档案引用时,将会把该变数内容读进来!好用的很,如果仅下达 export 而没有接变数时,那么此时将会把所有的‘环境变数’秀出来喔!例如:

[root@linux ~]# export
declare -x ENV="/root/.bashrc"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="linux.dmtsai.tw"
declare -x INPUTRC="/etc/inputrc"
declare -x LANG="en_US.UTF-8"
declare -x MAIL="/var/spool/mail/root"
declare -x SHELL="/bin/bash"
# 很多都直接省略了!不然....重复性太高,浪费版面~ ^_^

阅读(1452) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~