手册:AMD64/使用Gentoo/环境变量

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Handbook:AMD64/Working/EnvVar and the translation is 100% complete.
AMD64 手册
安装
关于安装
选择安装媒介
配置网络
准备磁盘
安装 stage3
安装基础系统
配置内核
配置系统
安装系统工具
配置引导程序
安装收尾
使用 Gentoo
Portage 介绍
USE 标记
Portage 功能特性
Initscript 系统
环境变量
使用 Portage
文件和目录
变量
混合使用不同的软件分支
额外的工具
自定义软件包仓库
高级特性
配置网络
开始
高级配置
模块化网络
无线网络
添加功能
动态管理


简介

环境变量是一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。通过使用环境变量,你可以很容易的修改一个牵涉到一个或多个应用程序的配置信息。

重要的例子

下表展示了一些Linux系统使用的变量并说明了它们的用处。在表格后面将列举一些变量例值。

Variable Description
PATH 这个变量包含了一系列由冒号分隔开的目录,系统就从这些目录里寻找可执行文件。如果你输入的可执行文件(例如 ls, rc-update或者 emerge)不在这些目录中,系统就无法执行它(除非你输入这个命令的完整路径,如/bin/ls)。
ROOTPATH 这个变量的功能和 PATH相同,但它只罗列出超级用户(root)键入命令时所需检查的目录。
LDPATH 这个变量包含了一系列用冒号隔开的目录,动态链接器将在这些目录里查找库文件。
MANPATH 这个变量包含了一系列用冒号隔开的目录,命令 man 会在这些目录里搜索man页面。
INFODIR 这个变量包含了一系列用冒号隔开的目录,命令 info 将在这些目录里搜索info页面。
PAGER 这个变量包含了浏览文件内容的程序的路径,比如(less 或者 more)
EDITOR 这个变量包含了修改文件内容的程序(文件编辑器)的路径(比如 nanovi).
KDEDIRS 这个变量包含了一系列用冒号隔开的目录,里面放的是KDE相关的资料。
CONFIG_PROTECT 这个变量包含了一系列用空格隔开的目录,它们在软件包更新的时候会被Portage保护起来。
CONFIG_PROTECT_MASK 这个变量包含了一系列用空格隔开的目录,它们在软件包更新的时候不会被Portage保护起来。

下面你可以找到所有这些变量定义的范例:

代码 定义范例
PATH="/bin:/usr/bin:/usr/local/bin:/opt/bin:/usr/games/bin"
ROOTPATH="/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin"
LDPATH="/lib:/usr/lib:/usr/local/lib:/usr/lib/gcc-lib/i686-pc-linux-gnu/3.2.3"
MANPATH="/usr/share/man:/usr/local/share/man"
INFODIR="/usr/share/info:/usr/local/share/info"
PAGER="/usr/bin/less"
EDITOR="/usr/bin/vim"
KDEDIRS="/usr"
CONFIG_PROTECT="/usr/X11R6/lib/X11/xkb /opt/tomcat/conf \
                /usr/kde/3.1/share/config /usr/share/texmf/tex/generic/config/ \
                /usr/share/texmf/tex/platex/config/ /usr/share/config"
CONFIG_PROTECT_MASK="/etc/gconf"

全局变量的定义

env.d目录

Gentoo采用了/etc/env.d/目录来集中定义全局变量。在这个目录里,你会发现很多类似 50baselayoutgcc/config-x86_64-pc-linux-gnu 等等这样的文件,它们包含了文件名中提到的应用程序需要的变量。

举个例子,当你安装 gcc时,ebuild 会创建一个名为 gcc/config-x86_64-pc-linux-gnu 的文件,里面包含了如下一些变量:

文件 /etc/env.d/gcc/config-x86_64-pc-linux-gnuGCC 13 默认启用的环境变量
GCC_PATH="/usr/x86_64-pc-linux-gnu/gcc-bin/13"
LDPATH="/usr/lib/gcc/x86_64-pc-linux-gnu/13:/usr/lib/gcc/x86_64-pc-linux-gnu/13/32"
MANPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/13/man"
INFOPATH="/usr/share/gcc-data/x86_64-pc-linux-gnu/13/info"
STDCXX_INCDIR="g++-v13"
CTARGET="x86_64-pc-linux-gnu"
GCC_SPECS=""
MULTIOSDIRS="../lib64:../lib"

其他的发行版会让你到/etc/profile或者其他地方修改和添加这些变量的定义。而Gentoo为用户(还有为Portage)提供了更加便捷的方式来维护和管理环境变量,以后你不再需要把精力放在那些众多的包含环境变量的文件身上了。

比如,当你更新完gcc 的时候, /etc/env.d/05gcc也会被同时更新,而不需要你手工来完成。

这不仅对Portage有益,作为用户,你也是受益者。有时候你需要设置某个系统范围的环境变量。我们拿http_proxy变量来做例子,为了避免http_proxy 搞乱,你只要新建一个文件/etc/env.d/99local然后添加你的定义:

文件 /etc/env.d/99local设置一个全局变量
http_proxy="proxy.server.com:8080"

通过使用同一个文件来定义你所有的变量,你对如何定义自己的变量有了个大概的了解。

env-update

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

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

代码 env-update所用的更新顺序
00basic        99kde-env       99local
     +-------------+----------------+-------------+
PATH="/bin:/usr/bin:/usr/kde/3.2/bin:/usr/local/bin"

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

可以通过将变量名添加到 COLON_SEPARATED or SPACE_SEPARATED (也在 /etc/env.d/ 文件)。

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

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

root #env-update && source /etc/profile
附注
上面的命令只会更新你当前终端里的环境变量、新控制台以及它们的子程序。因此,假如你正在X11里工作,你要么在每一个你打开的终端里输入source /etc/profile ,要么重新启动X,这样所有新的终端才能引用到新的变量。如果你使用了登录管理器,登陆成root然后输入 /etc/init.d/xdm 。如果不是这样,你需要注销然后重新登录回X这样才能产生使用新变量值的子程序。
重要
你在定义其他变量时不能使用shell变量。这意味着这样的定义 FOO="$BAR"(此处$BAR 是另外一个变量)是不允许的。

本地变量的定义

特定用户

你并不是一直都想定义全局变量。比如你想把/home/my_user/bin和当前目录(你当前所在的目录)添加到PATH 变量中,但又不想让其他用户的PATH变量中也有这个。如果你想定义一个本地变量,可以使用 ~/.bashrc 或者~/.bash_profile:

文件 ~/.bashrc在~/.bashrc中扩展PATH做为本地使用
# A colon followed by no directory is treated as the current working directory
PATH="${PATH}:/home/my_user/bin:"

当你重新登录的时候,你的PATH变量将被更新。

特定会话

有时候甚至需要更加严格的定义。你可能要使用一个你临时创建的目录里面的程序,而又不想输入它的路径或者为此短时间内内修改 ~/.bashrc

在这种情况下,你只需要在当前会话中使用export来定义 PATH 变量。只要你不注销,PATH变量将保持这个临时的设置。

root #export PATH="${PATH}:/home/my_user/tmp/usr/bin"