在Shell
的维护过程中,Shell
维护着大量的信息称为环境
。程序使用环境中存储的数据来确定有关配置。虽然大多数程序使用配置文件来存储配置,但某些程序还将寻找存储在环境中的值以调整他们的行为。
printenv
- 打印环境变量set
- 设置shell选项expert
- 将环境变量导出到后续执行的程序alias
- 为命令创建别名shell
程序在环境中存储两种基本数据类型,环境变量
和shell变量
。
Shell变量
是bash
放置在其中数据的一部分,而环境变量
基本上是其他所有。 除了变量之外,shell
还存储一些编程数据,即alias
和shell函数
。
要查看环境中存储的内容,可以使用bash内置的set
或printenv
程序。 set
命令将同时显示shell变量和环境变量,而printenv
将仅显示后者。
[root@iZerb5rob3dcf6Z ~]# printenv | less
XDG_SESSION_ID=622
HOSTNAME=iZerb5rob3dcf6Z
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=1.49.53.118 2175 22
SSH_TTY=/dev/pts/0
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40
#`也可以单独查看指定变量`
[root@iZerb5rob3dcf6Z ~]# printenv USER
root
......
当不带选项或参数的情况下使用set命令时,它将同时显示shell程序和环境变量
,以及任何已定义的Shell函数。与printenv不同,它的输出按字母顺序排序:
[root@iZerb5rob3dcf6Z ~]# set | less
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
COLUMNS=145
......
#用echo查看指定环境变量
[root@iZerb5rob3dcf6Z ~]# echo $HISTSIZE
1000
既不能用set也不能用printenv显示的环境变量之一是alias
。
[root@iZerb5rob3dcf6Z ~]# alias
alias cp='cp -i'
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 mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
一些有趣的环境变量
Variable | Contents |
---|---|
HOME |
用户主目录路径 |
SHELL | 用户shell名称 |
OLD_PWD |
上一个工作目录 |
PATH |
用冒号分隔的目录列表,所属可执行程序的列表 |
PS1 |
命令提示符 |
PWD |
当前工作目录 |
TERM |
终端类型的名称。类似Unix的系统支持许多终端协议;此变量设置要用于的协议您的终端模拟器 |
TZ |
指定时区。大多数类Unix系统维护协调世界时(UTC)中计算机的内部时钟然后通过应用由指定的偏移量来显示本地时间这个变量。 |
USER |
用户名 |
LANG |
指定语言字符集的排序规则 |
Examples:
[root@iZerb5rob3dcf6Z ~]# echo $HOME
/root
[root@iZerb5rob3dcf6Z ~]# echo $SHELL
/bin/bash
[root@iZerb5rob3dcf6Z ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@iZerb5rob3dcf6Z ~]# echo $TERM
xterm
[root@iZerb5rob3dcf6Z ~]# echo $USER
root
当我们登录系统时,bash
程序启动,并读取一系列称为启动文件的配置脚本,这些脚本定义了所有用户共享的默认环境。
接下来是我们的主目录中的更多启动文件,这些文件定义了我们的个人环境。 确切的顺序取决于要启动的Shell会话的类型。 有两种:登录外壳会话
和非登录外壳会话
。登录shell会话
是一个提示我们输入用户名和密码
的会话。 例如,当我们启动虚拟控制台会话时。 当我们在GUI中启动终端会话时,通常会发生非登录Shell会话。
File | Contents |
---|---|
/etc/profile |
适用于所有用户的全局配置脚本 |
~/.bash_profile |
用户的个人启动文件,可用于扩展或覆盖全局脚本中的设置 |
~/.bash_login |
如果找不到~/.bash_profile,则bash会尝试阅读此脚本 |
~/.profile |
如果~/.bash_profile and ~/.bash_login都找不到,则尝试读取此文件 |
[root@iZerb5rob3dcf6Z ~]# ls -d .*
. .bash_history .bash_profile .config .npm .pki .pydistutils.cfg .tcshrc
.. .bash_logout .bashrc .cshrc .pip .profile .ssh .viminfo
File | Contents |
---|---|
/etc/bash.bashrc |
适用于所有用户的全局配置脚本 |
~/.bashrc |
用户的个人启动文件,可用于扩展或覆盖全局配置脚本中的设置 |
除了读取上面的启动文件之外,非登录外壳程序还从其父进程(通常是登录外壳程序)继承环境
。
从普通用户的角度来看,〜/ .bashrc
文件可能是最重要的启动文件,因为它几乎总是被读取。 非登录shell程序默认情况下会读取它,并且大多数登录shell程序的启动文件都以读取〜/ .bashrc
文件的方式编写。
以~/.bash_profile
为例:
[root@iZerb5rob3dcf6Z ~]# vim .bash_
# .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
可以看到这段代码是登录shell程序获取.bashrc
内容的方式。 启动文件中的下一件事情与PATH
变量有关。
想象一下,当我们在命令行中输入命令时,shell如何知道在哪里可以找到命令? 例如,当我们输入cd时,shell不会搜索整个计算机来查找/ bin / cd(cd 命令的完整路径名),而是搜索PATH变量中包含的目录列表。
PATH变量通常(但并非总是如此,取决于发行版)由/etc/profile
启动文件设置,并带有以下代码:
[root@iZerb5rob3dcf6Z ~]# $PATH:$HOME/bin
[root@iZerb5rob3dcf6Z ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
修改了PATH,将目录$ HOME / bin
添加到列表的末尾。证明如下:
[root@iZerb5rob3dcf6Z ~]# google="This is things "
[root@iZerb5rob3dcf6Z ~]# echo $google
This is things
[root@iZerb5rob3dcf6Z ~]# google=$google"text."
[root@iZerb5rob3dcf6Z ~]# echo $google
This is things text.
使用这种技术,我们可以将文本追加到变量内容的末尾。通过将字符串$ HOME / bin
添加到PATH变量内容的末尾,将目录$ HOME / bin
添加到输入命令时搜索的目录列表中。
这意味着当我们想在主目录中创建一个目录来存储我们自己的私有程序时,shell程序就可以找到我们了。 我们所要做的就是将其命名为bin
。
[root@iZerb5rob3dcf6Z ~]# export PATH
export
命令告诉Shell使PATH的内容可用于此Shell的子进程
。
我们知道启动文件在哪里以及它们包含什么,所以我们可以将它们修改为定制我们的环境。
通常,要将目录添加到PATH或定义其他环境变量,请将这些更改放在.bash_profile
中,对于其他所有内容,请将更改放置在 .bashrc
。 除非您是系统管理员,并且需要更改系统所有用户的默认设置,否则请不要将修改内容限制在主目录中。
[root@iZerb5rob3dcf6Z ~]#vim .bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
#以下是我所添加的
#更改umask是文件共享更容易
umask 0002
#忽略历史命令中的重复项,并设置1000行
export HISTCONTROL=ignoredups
export HISTSIZE=1000
#添加别名
alias l.d='ls -d .* --color=auto'
我们对.bashrc
所做的更改在关闭终端会话并开始新会话之前不会生效,因为.bashrc
文件仅在会话开始时读取。 但是,我们可以使用以下命令强制bash重新读取修改后的.bashrc
文件:
[root@iZerb5rob3dcf6Z ~]# source .bashrc
[root@iZerb5rob3dcf6Z ~]# l.d
. .bash_history .bash_profile .bashrc.bak .cshrc .pip .profile .ssh .viminfo
.. .bash_logout .bashrc .config .npm .pki .pydistutils.cfg .tcshrc
可以看到,我们设置的别名已经生效了。
更多知识