在shell会话调用环境(environment)期间, shell会存储大量的信息。程序使用存储在环境中的数据来确定我们的配置。
1.环境中存储的是什么
shell在环境中存储了两种基本类型的数据——环境变量(environment variable)和shell变量(shell variable),两者基本上没有区别。shell变量就是由bash存放的少量数据,还有一些编程数据(programmatic data)——别名和shell函数。环境变量就是除此之外的其它变量。
1.1 检查环境
$ printenv | less
我的得到如下结果
XDG_SESSION_ID=20111
GUESTFISH_INIT=\e[1;34m
HOSTNAME=head02
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=10.98.122.21 26750 22
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
SSH_TTY=/dev/pts/100
QT_GRAPHICSSYSTEM_CHECKED=1
USER=limj
LD_LIBRARY_PATH=/usr/local/lib64:
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:
GUESTFISH_PS1=\[\e[1;32m\]><fs>\[\e[0;31m\]
MAIL=/var/spool/mail/lixj
PATH=/share/apps/AFNI_18.3.03/linux_centos_7_64:/share/apps/mrtrix3/bin:/share/apps/common_tools/bin:/share/apps/mricrogl_lx:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/ibutils/bin:/home1/lixj/.local/bin:/home1/lixj/bin
PWD=/home1/lixj/OpenImage
LANG=zh_CN.UTF-8
GUESTFISH_OUTPUT=\e[0m
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
HISTCONTROL=ignoredups
SHLVL=1
HOME=/home1/limj
LOGNAME=limj
QTLIB=/usr/lib64/qt-3.3/lib
XDG_DATA_DIRS=/home1/limj/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
SSH_CONNECTION=10.98.122.21 26750 10.190.65.12 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/1090
GUESTFISH_RESTORE=\e[0m
OLDPWD=/home1/limj
_=/usr/bin/printenv
输出结果是一系列的环境变量及其变量值。我们也可以打印单个环境变量,例如
$ printenv USER
lixj
也可以使用set命令,如果不带任何参数,只会显示shell变量、环境变量以及任何已经定义的shell函数
$ set | less
set输出结果是按照字母顺序排列的。
set命令和printenv命令都不能显示的一个环境变量是别名。要查看别名,需使用不带任何参数的alias
命令。
$ alias
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias qsub='echo '\''qsub'\'' is not work and disabled on this node.'
alias vi='vim'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
1.2 有趣的环境变量
表1 环境变量
变量 | 说明 |
---|---|
DISPLAY | 运行图形界面环境时的名称。通常为O,表示由X服务器生成的第一个界面 |
EDITOR | 用于文本编辑的程序名称 |
SHELL | 本机shell名称 |
HOME | 本机主目录的路径名 |
LANG | 定义了本机语言的字符集和排序规则 |
OLD_PWD | 先前的工作目录 |
PAGER | 用于分页输出的程序名称。通常设置为/usr/bin/less |
PATH | 以冒号分割的一个目录列表,当用户输入一个可执行程序的名称时,会查找该目录列表 |
PS1 | 提示符字符1,定义了本机shell系统提示符的内容 |
PWD | 当前工作目录 |
TERM | 终端类型的名称,类UNIX系统支持很多终端协议;此变量设定了本机终端模拟器使用的协议 |
TZ | 用于指定本机所在的时区,大多数类UNIX系统以UTC来维护计算机的内部时钟,而显示的本地时间是根据本变量确定的时差计算出来的 |
USER | 用户名 |
2.环境是如何建立的
用户登录系统后,bash程序就会启动并读取一系列成为启动文件的配置脚本,这些脚本定义了所有用户共享的默认环境。接下来,bash会读取更多存储在主目录下的用于定义个人环境的启动文件。
2.1 login和non-login shell
shell会话存在两种类型,分别为login shell会话和non-login shell会话。
login shell会话会提示用户输入用户名和密码,如虚拟控制台会话。而我们在GUI中启动的终端会话就是一个典型的non-login shell会话。
表2 login shell的启动文件
文件 | 说明 |
---|---|
/etc/profile | 适用于所有用户的全局配置脚本 |
~/.bash_profile | 用户的个人启动文件。可扩展或重写全局配置脚本中的设置 |
~/.bash_login | 若~/.bash_profile缺失,则bash尝试读取此脚本 |
~/.profile | 若/.bash_profile与/.bash_login均确实,则bash尝试读取此文件,在基于Debian的Linux版本(比如Ubuntu)中,这是默认值 |
表3 non-login shell的启动文件
文件 | 说明 |
---|---|
/etc/bash.bashrc | 适用于所有用户的全局配置脚本 |
~/.bashrc | 用户的个人启动文件。可扩展或重写全局配置脚本中的设置 |
2.2 启动文件内容
启动文件中#开头的语句是注释,shell不会读取注释行
启动文件中最重要的元素是PATH变量,格式一般为
PATH=$PATH:$HOME/bin
这段代码将$HOME/bin添加到了PATH值的尾部,这是一个参数扩展的实例,此时,当系统需要检错用到的输入命令时,$HOME/bin这个路径就会处于被搜索的路径列表中。这就意味着当我们想在主目录下创建名为bin的目录,并在此目录中存放自己的私有程序时,shell已经为我们准备好 ,我们要做的就是将创建的目录称之为bin.
最后一行是如下代码
export PATH
该export命令告诉shell,将shell的子进程使用PATH变量的内容
3.修改环境
3.1 用户应该修改哪些文件
一般来说,在PATH中添加目录,或者定义额外的环境变量,需要讲这些更改放到.bash_profile文件中去(或者其它等效文件,取决于Linux的版本,如Ubuntu系统使用.profile文件)。其它改变应录入.bashrc文件中.
3.2 如何修改
一般会先保存原来的配置文件,防止我们误操作。
$ cp .bashrc .bashrc.bak
为备份文件取什么名字不重要,只要易于理解就好,常见的后缀有**.bak、.sav、.old和.orig**.
$ vim ./bashrc
将需要添加的环境变量添加到文件末尾,例如
表4 可以添加的环境变量
代码行 | 含义 |
---|---|
umask 0002 | 设置umask值为0002 |
export HiSTCONTROL=ignoredups | 使shell的历史记录功能忽略与上一条录入的命令重复的命令 |
export HISTSIZE=1000 | 使命令记录规模从默认的500行增加到1000行 |
alias l.=‘ls -d .* --color=auto’ | 创建新的命令l.,功能是显示所有以.开头的目录条目 |
最后,对新添加的环境变量增加注释
3.4 激活环境
由于只有在启动shell会话时才会读取.bashrc,所以对.bashrc做出的修改只有在关闭shell终端会话并重启时才会生效.当然也可以使用以下命令强制bash重新读取.bashrc文件
$ source .bashrc