环境变量

参考:环境变量加载实践, 环境变量加载顺序



查看环境变量

SHELL启动时会加载一系列初始化脚本,脚本中定义的一些全局变量将自动传递给子进程,这些变量被称为环境变量。简单的说,环境变量就是在当前操作环境下,随时可以调用的一些变量。

set:显示当前shell所有可用变量

env:显示所有环境变量

export:设置新的环境变量

unset:清除环境变量

[TOP]


设置环境变量

$ export MYENVVAR="test"
$ echo $MYENVVAR
test
$ unset $MYENVVAR

export可用于设置环境变量,unset用于清除环境变量,不过,更直观的方法则是直接更改相关的配置文件。这些配置文件是SHELL在启动时加载的。

有些shell脚本在交互界面正常运行,但是在crontab中却无法启动,这基本上都是环境变量设置不当引起的。

$ crontab -e
*/1 *  * * * echo $PATH > $HOME/cron_env.out
$ cat cron_env.out
/usr/bin:/bin
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

为了使脚本能够正常运行,可使用type查看相关命令的路径,如:

$ type jq
jq is /usr/local/bin/jq

在shell脚本中设置环境变量:

export PATH=/usr/local/bin:$PATH

常用的需要设置环境变量的命令还有:serviceifup等。

[TOP]


加载环境变量

/etc/enviroment #找不到该文件,系统无法启动
/etc/profile #找不到该文件,跳过
  -->/etc/bash.bashrc
  -->/etc/profile.d/ 下的所有.sh文件
~/.profile (或~/.bash_profile 或 ~/.bash_login) #用户未登陆时跳过
  -->~/.bashrc
    -->~/.bash_aliases
    -->/etc/bashrc

/etc/enviroment 在系统一些核心组件加载完成后最先调用,很多外围的程序都依赖它运行,如果这里面出现了什么问题,那么很可能导致系统无法正常启动,相当于是系统级别的公共环境变量。/etc/profile 在启动登陆环境时被首先执行,相当于是应用级的公共环境变量。~/.profile在shell被打开时,次于/etc/profile执行,相当于是应用级的用户环境变量。

注意:~/.bash_profile 是交互式login方式进入 bash 运行的,~/.bashrc 是交互式non-login方式进入 bash 运行的,前者会调用后者。在使用crontab设置调用脚本时应特别注意其不同之处。

[TOP]


常见环境变量

_(下划线) 上一条命令的最后一个参数

BASH 展开为调用bash实例时使用的全路径名

CDPATH cd命令的搜索路径。它是以冒号分隔的目录列表,shell通过它来搜索cd命令指定的目标目录。例如.:~:/usr

EDITOR 内置编辑器emacs、gmacs或vi的路径名

ENV 每一个新的bash shell(包括脚本)启动时执行的环境文件。通常赋予这个变量的文件名是.bashrc。

EUID 展开为在shell启动时被初始化的当前用户的有效ID

GROUPS 当前用户所属的组

HISTFILE 指定保存命令行历史的文件。默认值是~/.bash_history。如果被复位,交互式shell退出时将不保存命令行历史

HISTSIZE 记录在命令行历史文件中的命令数。默认是500

HOME 主目录。未指定目录时,cd命令将转向该目录

IFS 内部字段分隔符,一般是空格符、制表符和换行符,用于由命令替换,循环结构中的表和读取的输入产生的词的字段划分

LANG 用来为没有以LC_开头的变量明确选取的种类确定locale类

OLDPWD 前一个工作目录

PATH 命令搜索路径。一个由冒号分隔的目录列表,shell用它来搜索命令,一个普通值为 /usr/gnu/bin:/usr/local/bin:/usr/ucb:/usr/bin

PPID 父进程的进程ID

PS1 主提示符串,默认值是$

PS2 次提示符串,默认值是>

PS3 与select命令一起使用的选择提示符串,默认值是#?

PS4 当开启追踪时使用的调试提示符串,默认值是+。追踪可以用set –x开启

PWD 当前工作目录。由cd设置

RANDOM 每次引用该变量,就产生一个随机整数。随机数序列可以通过给RANDOM赋值来初始化。如果RANDOM被复位,即使随后再设置,它也将失去特定的属性

REPLY 当没有给read提供参数时设置

SHELL 当调用shell时,它扫描环境变量以寻找该名字。shell给PATH、PS1、PS2、MAILCHECK和IFS设置默认值。HOME和MAIL由login(1)设置

SHELLOPTS 包含一列开启的shell选项,比如braceexpand、hashall、monitor等

UID 展开为当前用户的用户ID,在shell启动时初始化

[TOP]