免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5470 | 回复: 2
打印 上一主题 下一主题

Linux系统环境变量 [转] [复制链接]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-05 19:32 |只看该作者 |倒序浏览
shell基础1:文件安全与权限
http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger

附:Linux的用户和用户组管理
http://bbs.chinaunix.net/forum/viewtopic.php?t=438660&highlight=wingger

shell基础二:查找技巧,find及xargs的使用
http://bbs.chinaunix.net/forum/viewtopic.php?t=441883&highlight=wingger

shell基础三和四:后台(crontab,at,&,nohup)及(*,?,[]等)
http://bbs.chinaunix.net/forum/viewtopic.php?t=442596&highlight=wingger

shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
http://bbs.chinaunix.net/forum/viewtopic.php?t=444209&highlight=wingger

shell基础六七:命令执行顺序(||及&&,{}及())和正则表?
http://bbs.chinaunix.net/forum/viewtopic.php?t=445229&highlight=wingger

shell基础八:文本过滤工具(grep)
http://bbs.chinaunix.net/forum/viewtopic.php?t=446683&highlight=wingger

http://bbs.chinaunix.net/forum/viewtopic.php?t=448687&highlight=wingger
shell基础九:awk

http://bbs.chinaunix.net/forum/viewtopic.php?t=452942&highlight=wingger
shell基础十:sed

http://bbs.chinaunix.net/forum/viewtopic.php?t=457730&highlight=wingger
基础11:文件分类、合并和分割(sort,uniq,join,cut,paste,split)

shell基础十二:tr
http://bbs.chinaunix.net/forum/viewtopic.php?t=459099&highlight=wingger



算是找个地方放,呵呵

Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义。用户可以对自己的运行环境进行定制,其方法就是修改相应的系统环境变量。

常见的环境变量

对于PATH和HOME等环境变量大家都不陌生。除此之外,还有下面一些常见环境变量。

◆ HISTSIZE是指保存历史命令记录的条数。

◆ LOGNAME是指当前用户的登录名。

◆ HOSTNAME是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。

◆ SHELL是指当前用户用的是哪种Shell。

◆ LANG/LANGUGE是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。

◆ MAIL是指当前用户的邮件存放目录。

◆ PS1是基本提示符,对于root用户是#,对于普通用户是$。PS2是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令会将提示符修改成字符串“Hello,My NewPrompt ”。

  1. # PS1=" Hello,My NewPrompt :) "
  2. Hello,My NewPrompt :)
复制代码




除了这些常见的环境变量,许多应用程序在安装时也会增加一些环境变量,比如使用Java就要设置JAVA_HOME和CLASSPATH等,而安装五笔输入法会增加环境变量"XMODIFIERS=@im=fcitx"等。

定制环境变量

环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell。对于Linux来说一般是bash,但也可以重新设定或切换到其它的Shell。环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可以通过变量名来访问相应的环境变量,通过export来设置环境变量。下面通过几个实例来说明。

1. 显示环境变量HOME

  1. $ echo $HOME
  2. /home/terry
复制代码




2. 设置一个新的环境变量WELCOME

  1. $ export WELCOME="Hello!"
  2. $ echo $WELCOME
  3. Hello!
复制代码




3. 使用env命令显示所有的环境变量

  1. $ env
  2. HOSTNAME=terry.mykms.org
  3. PVM_RSH=/usr/bin/rsh
  4. SHELL=/bin/bash
  5. TERM=xterm
  6. HISTSIZE=1000
  7. ...
复制代码



4. 使用set命令显示所有本地定义的Shell变量

  1. $ set
  2. BASH=/bin/bash
  3. BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="i386-redhat-linux-gnu")
  4. BASH_VERSION='2.05b.0(1)-release'
  5. COLORS=/etc/DIR_COLORS.xterm
  6. COLUMNS=80
  7. DIRSTACK=()
  8. DISPLAY=:0.0
  9. ...
复制代码



5. 使用unset命令来清除环境变量

  1. set可以设置某个环境变量的值。清除环境变量的值用unset命令。如果未指定值,则该变量值将被设为NULL。示例如下:

  2. $ export TEST="Test..."     #增加一个环境变量TEST
  3. $ env|grep TEST             #此命令有输入,证明环境变量TEST已经存在了
  4. TEST=Test...
  5. $ unset $TEST               #删除环境变量TEST
  6. $ env|grep TEST  #此命令没有输出,证明环境变量TEST已经存在了
复制代码




6. 使用readonly命令设置只读变量

如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:

  1. $ export TEST="Test..."  #增加一个环境变量TEST
  2. $ readonly TEST  #将环境变量TEST设为只读
  3. $ unset TEST  #会发现此变量不能被删除
  4. -bash: unset: TEST: cannot unset: readonly variable
  5. $ TEST="New"  #会发现此也变量不能被修改
  6. -bash: TEST: readonly variable
复制代码




7. 用C程序来访问和设置环境变量

对于C程序的用户来说,可以使用下列三个函数来设置或访问一个环境变量。

◆ getenv()访问一个环境变量。输入参数是需要访问的变量名字,返回值是一个字符串。如果所访问的环境变量不存在,则会返回NULL。

◆ setenv()在程序里面设置某个环境变量的函数。

◆ unsetenv()清除某个特定的环境变量的函数。

另外,还有一个指针变量environ,它指向的是包含所有的环境变量的一个列表。下面的程序可以打印出当前运行环境里面的所有环境变量:

  1. #include <stdio.h>
  2. extern char**environ;
  3. int main ()
  4. {
  5. char**var;
  6. for (var =environ;*var !=NULL;++var)
  7. printf ("%s \n ",*var);
  8. return 0;
  9. }
复制代码




还可以通过修改一些相关的环境定义文件来修改环境变量,比如对于Red Hat等Linux发行版本,与环境相关的文件有/etc/profile和~/.bashrc等。修改完毕后重新登录一次就生效了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2004-12-05 19:38 |只看该作者

Linux系统环境变量 [转]

摘自Gentoo手册

环境变量是什么?

环境变量是一个已命名的对象 (named object), 它包含了让一个或多个应用程序使用的一些信息. 许多用户 (尤其是 Linux 的新用户) 会觉得这东西似乎颇为诡异或难以捉摸 (a bit weird or unmanageable). 这感觉是不对的: 使用环境变量, 我们可以轻松地改变一个或多个应用程序的配置.

重要的例子
下表给出了 Linux 系统中所用的好些环境变量及其描述. 其示例值在表后给出.

变量 描述
PATH 该变量包含了一个以冒号分隔的目录列表以让系统在这些目录里寻找可执行文件. 如果您输入了一个可执行文件的名字 (如 ls, rc-update 或 emerge), 而该文件却不在这一列表中的任一目录里, 则您的系统将不会执行它 (除非您输入完整的路径, 如 /bin/ls)

ROOTPATH 该变量共同与 PATH 同, 不过它仅列出根用户 (root-user) 输入一个命令时应该寻找的目录.

LDPATH 该变量包含了一个以冒号分隔的目录列表以让动态链接器 (dynamical linker) 在这些目录里寻找库文件 (library).

MANPATH 该变量包含了一个以冒号分隔的目录列表以让 man 命令在这些目录里寻找手册页

INFODIR 该变量包含了一个以冒号分隔的目录列表以让 info 命令在这些目录里选择信息页

PAGER 该变量包含了用以查看文件内容的程序 (如 less 或 more) 所在的路径

EDITOR 该变量包含了用以编辑文件内容的程序 (如 nano 或 vi) 所在的路径

KDEDIRS 该变量包含了一个以冒号分隔的目录列表, 这些目录里包含了 KDE 专用的东西

CLASSPATH 该变量包含了一个以冒号分隔的目录列表, 这些目录里包含了ava 类

CONFIG_PROTECT 该变量包含了一个以空格分隔的目录列表, 这些目录是 Portage 在更新时需要进行保护的

CONFIG_PROTECT_MASK 该变量包含了一个以空格分隔的目录列表, 这些目录是 Portage 在更新时无须进行保护的


下面给出这些变量的示例定义:

代码清单 1: 示例定义
  1. PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
  2. ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
  3. LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
  4. MANPATH="/usr/share/man:/usr/local/share/man"
  5. INFODIR="/usr/share/info:/usr/local/share/info"
  6. PAGER="/usr/bin/less"
  7. EDITOR="/usr/bin/vim"
  8. KDEDIRS="/usr"
  9. CLASSPATH="/opt/blackdown-jre-1.4.1/lib/rt.jar:."
  10. CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \
  11.                 /usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \
  12.                 /usr/share/texmf/tex/platex/config/ /usr/share/config"
  13. CONFIG_PROTECT_MASK="/etc/gconf
复制代码


定义全局变量
/etc/env.d 目录
为了集中管理 (centralize) 这些变量的定义, Gentoo 包含了一个 /etc/env.d 目录. 该目录中您会看到数个文件, 如 00basic, 05gcc 等等. 这些文件包含了其命名中所提到的应用程序所需的环境变量 (which contain the variables needed by the application mentioned in their name) (Cure: 如 05gcc 里带的是 gcc 要用的环境变量, 10mozilla 带的是 mozilla 要用的环境变量, 20java 里是 java 要用的环境变量, 依此类推).

例如, 您安装完 gcc 之后, gcc 的 ebuild 就会创建一个名为 05gcc 的文件, 里面包含了如下变量的定义:

代码清单 2: /etc/env.d/05gcc
  1. PATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
  2. ROOTPATH="/usr/i686-pc-linux-gnu/gcc-bin/3.2"
  3. MANPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/man"
  4. INFOPATH="/usr/share/gcc-data/i686-pc-linux-gnu/3.2/info"
  5. CC="gcc"
  6. CXX="g++"
  7. LDPATH="/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
复制代码



其他发行版会让您在 /etc/profile 或其他某个地方修改或添加这样那样的环境变量, 而 Gentoo 为您 (也为 Portage) 提供了一个很轻松的方式来维护和管理它们, 同时无须关心那些都可以包含环境变量的诸多文件.

例如, 当 gcc 更新时, /etc/env.d/05gcc 同时更新而无须用户操心.

这不仅让 Portage 受益, 还包括您, 作为一个用户. 不时地, 您会需要设定某个应用到系统范围的环境变量. 我们以 http_proxy 变量为例. 我们不必去 /etc/profile 里乱搞, 仅需创建一个文件 (/etc/env.d/99local) 并把定义写里面就搞定:

代码清单 3: /etc/env.d/99local
  1. http_proxy="proxy.server.com:8080"
复制代码


以同一个文件来放置您的所有变量, 您就可以很容易地知道自己都定义了哪些变量.

env-update 脚本
数个 /etc/env.d 中的文件里都定义了 PATH 变量, 这没有问题的: 当您运行 env-update, 它会在更新环境变量之前会先把这些定义添加到一起, 籍此可以让软件包 (或用户) 很轻松地添加自己的环境变量而无须担心干扰到原有的值.

env-update 脚本会将 /etc/env.d 下的文件按字母顺序逐个添加它们里面的值. 这就是为什么 /etc/env.d 下的许多文件都以数字开头.

代码清单 4: env-update 的更新顺序
  1.          00basic        99kde-env       99local
  2.      +-------------+----------------+-------------+
  3. PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"
复制代码



运行 env-update 的时候, 该脚本创建所有环境变量并将它们放在 /etc/profile.env 文件中 (为 /etc/profile 所用). 同时, 它还从 LDPATH 变量中提取信息以创建 /etc/ld.so.conf. 之后, 它将运行 ldconfig 以重新创建为动态链接器 (dynamical linker) 所用的 /etc/ld.so.cache 文件.

如果您想在运行 env-update 之后马上看到效果, 请运行如下命令来更新您的环境. 自己装过 Gentoo 的用户想必对安装指南中的这句并不陌生:

代码清单 5: 更新环境
  1. # env-update && source /etc/profile
复制代码


定义局部变量
用户特定
您并非总想全局性地定义某个变量. 例如, 您或许想让 /home/my_user/bin 成为 PATH 变量里的一部分, 而同时又不没必要让系统中的其他用户的 PATH 里有这个路径. 您要想局部地定义变量, 请使用 ~/.bashrc 或 ~/.bash_profile 文件:

代码清单 6: 在 ~/.bashrc 中扩展 PATH 变量以供局部 (Cure: 只对本用户有用) 使用
  1. PATH="${PATH}:/home/my_user/bin"
复制代码


您重新登录后, PATH 变量就会被更新.

会话特定
有时我们还需要定义范围更狭窄 (stricter) 的变量. 您也许想使用自己临时创建目录中的一些 (可执行的) 二进制文件, 而又不想总输入它们的完整路径, 也不想就为了这么一小会儿的使用而去编辑 ~/.bashrc.

这种情况下, 您可以用 export 命令在您当前的会话中定义 PATH 变量. 只要您未曾注销, 则 PATH 变量会一直使用该临时值.

代码清单 7: 定义会话特定 (session-specific) 的环境变量
  1. # export PATH="${PATH}:/home/my_user/tmp/usr/bin"
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2004-12-05 22:41 |只看该作者

Linux系统环境变量 [转]

确切的说,gnu/linux是一个多任务多用户的网络操作系统!
P.S:顶就一个字!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP