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
常用的需要设置环境变量的命令还有:service
,ifup
等。
[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]