Top

D8:配置和环境之一

环境

shell在shell会话期间维护一个称为环境的信息体。程序使用存储在环境中的数据来确定有关系统配置的事实。
大多数程序有自己的配置文件来存储程序设置,但有些程序也会查找环境中的值来调整其行为。
本节涉及的命令有: 目录:

环境里保存了什么?

shell在环境变量中存储两种基本类型的数据:环境变量和shell变量。
但对于bash,这些类型在很大程度上是无法区分的。
shell变量是bash放在那里的数据位;环境变量是其他所有变量。
除了变量外,shell还存储一些编程数据,即别名和shell函数。

审视环境

要查看存储在环境变量中的内容,可以使用bash中内置的set命令或printenv程序。
set命令会同时显示shell和环境变量,而printenv仅显示环境变量。
[me@linuxbox ~]$ printenv | less
USER=me
PAGER=less
LSCOLORS=Gxfxcxdxbxegedabagacad
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg
PATH=/home/me/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/
sbin:/bin:/usr/games:/usr/local/games
DESKTOP_SESSION=ubuntu
QT_IM_MODULE=ibus
QT_QPA_PLATFORMTHEME=appmenu-qt5
JOB=dbus
PWD=/home/me
XMODIFIERS=@im=ibus
GNOME_KEYRING_PID=1850
LANG=en_US.UTF-8
GDM_LANG=en_US
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
 MASTER_HOST=linuxbox
IM_CONFIG_PHASE=1
COMPIZ_CONFIG_PROFILE=ubuntu
GDMSESSION=ubuntu
SESSIONTYPE=gnome-session
XDG_SEAT=seat0
HOME=/home/me
SHLVL=2
LANGUAGE=en_US
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LESS=-R
LOGNAME=me
COMPIZ_BIN_PATH=/usr/bin/
LC_CTYPE=en_US.UTF-8
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/
usr/share/
QT4_IM_MODULE=xim
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-IwaesmWaT0
LESSOPEN=| /usr/bin/lesspipe %s
INSTANCE=	
printenv命令可以累出特定变量的值:
[me@linuxbox ~]$ printenv USER
me
set命令不带任何选项或参数的话,会显示shell和环境变量,以及任何已定义的shell函数。与printenv不同,它的输出是按字母顺序排列的。
使用echo命令也可以显示变量内容,例如:
[me@linuxbox ~]$ echo $HOME
/home/me
别名在set命令和printenv命令中都不显示,要查看它们,可使用不带参数的alias命令:
[me@linuxbox ~]$ alias
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --showdot
--show-tilde'	

一些有趣的值

环境包含很多变量。
变量 含义
DISPLAY 如果运行图形环境,则为显示的名称。
通常为":0",表示X服务器生成的第一个显示。
EDITOR 文本编辑器的名称
SHELL 默认的sell名称
HOME 主目录的路径名
LANG 定义语言的字符集和排序顺序
OLDPWD 上一次工作目录
PAGER 用于分页输出的程序的名称,通常为less(/usr/bin/less)。
PATH 以冒号分隔的目录列表,当输入可执行程序的名称时,系统会去这些目录搜索匹配的命令。
PS1 “提示字符串1(prompt string 1)”的缩写,定义shell提示字符的内容。(tcsh中无此项)
PWD 当前工作目录
TERM 终端类型的名称。
类Unix系统支持多种终端协议,此变量设置要与终端仿真器一起使用的协议。
TZ 指定时区。大多数类Unix系统将计算机的内部时钟保持为协调世界时(Coordinated Universal Time UTC),然后通过应用此变量指定的偏移量来显示本地时间。
bash和tcsh中均无此项。
USER 当前用户名

环境是如何建立的

登录到系统时,bash程序启动,并读取一系列名为startup file的配置脚本,这些脚本定义了所有用户共享的默认环境。
然后是每个用户的主目录中定义的个人环境的更多启动文件。
确切的顺序取决于正在启动的shell会话的类型。有两种: 登录shell读取一个或多个启动文件:
文件 说明
/etc/profile 对所有用户生效的全局配置脚本
~/.bash_profile 用户的个人启动文件
可用于扩展或覆盖全局配置脚本中的设置。
~/.bash_login 如果没有~/.bash_profile,bash会尝试读取这个脚本。
~/.profile 如果以上两个脚本都没有,bash将尝试读取此脚本。debian系默认使用此脚本。
非登录shell读取以下启动文件:
文件 说明
/etc/bash.bashrc 对所有用户生效的全局配置脚本
~/.bashrc 用户自己的启动文件
可用于扩展或覆盖全局配置脚本中的设置。
除了读取上表所述的启动文件外,非登录shell还从其父进程(通常是登录shell)继承环境。

启动文件里有什么?

CentOS6的.bash_profile看起来像下面的样子:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH	
以上共分三部分,第一部分是个if复合命令,它直译过来是:
If the file "~/.bashrc" exists, then read the "~/.bashrc" file.
这段代码是登录shell获取.bashrc内容的方式。

第二部分定义了PATH,告诉系统去哪里找命令。

第三部分,输出PATH。

编辑环境

编辑哪些文件

一般来说,要想路径中添加目录或定义其他环境变量,硬将更改放在.bash_profile(对于不同的发行版,会有不同,例如,Ubuntu应放在.profile中)。对于其他所有内容,应放在.bashrc中。

文本编辑器

文本编辑器分为两个基本类别:图形编辑器和基于文本的编辑器。
GNOME附带了一个名为gedit的编辑器,通常在GNOME菜单中被称为“Text Editor”(文本编辑器);KDE通常附带三款,分别是kedit、kwrite、kate。
基于文本的编辑器主要有nano、vi、emacs。

使用文本编辑器

编辑任何重要配置文件之前,都要对其进行备份。注意,cp命令将默默地覆盖已有同名文件。

对于任何文本编辑器,首先要学会如何退出,然后要学会如何保存。

注释很重要。

一个例子,在.bashrc文件中添加以下内容:
umask 0002
export HISTCONTROL=ignoredups
export HISTSIZE=1000
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
解释:
含义
umask 0002 设置umask已解决以前遇到的共享目录的问题
export HISTCONTROL=ignoredups 使shell的历史记录功能忽略刚刚记录的命令
export HISTSIZE=1000 设置历史记录的行数为1000,默认为500
alias l.='ls -d .* --color=auto' 创建一个新的命令l.,显示所有以.开头的文件
alias ll='ls -l --color=auto' 创建一个新命令ll,显示长格式列表

激活变更

在关闭并重启新会话之前,对.bashrc的变更不会生效,因为.bashrc文件仅在会话开始时被读取。
要强制bash重新读取修改后的.bashrc,可以使用以下命令:
[me@linuxbox ~]$ source ~/.bashrc