Linux环境详情与配置——export,alias,set,printenv

2023-05-16

在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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux环境详情与配置——export,alias,set,printenv 的相关文章

随机推荐