环境变量解析

环境

  • 环境
    • 环境中存储了什么
      • 查看环境变量
      • 创建环境变量
      • 启动文件中有什么?
      • export
    • 修改环境变量
  • 扩展

环境

Shell的维护过程中,Shell维护着大量的信息称为环境。程序使用环境中存储的数据来确定有关配置。虽然大多数程序使用配置文件来存储配置,但某些程序还将寻找存储在环境中的值以调整他们的行为。

  • printenv - 打印环境变量
  • set - 设置shell选项
  • expert- 将环境变量导出到后续执行的程序
  • alias - 为命令创建别名

环境中存储了什么

shell程序在环境中存储两种基本数据类型,环境变量shell变量
Shell变量bash放置在其中数据的一部分,而环境变量基本上是其他所有。 除了变量之外,shell还存储一些编程数据,即aliasshell函数

查看环境变量

要查看环境中存储的内容,可以使用bash内置的setprintenv程序。 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会话。

  • 登录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
  • 非登录shell会话读取以下启动文件:
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

export

[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

可以看到,我们设置的别名已经生效了。

扩展

更多知识

你可能感兴趣的:(Linux必备)