以bash为例,当linux在启动的时候,会读取 /etc/profile文件,其实这个文件就是一个shell脚本文件,所以可以在这个文件中定义一些环境变量。
注意:在这个文件中定义的变量是系统变量,即:只要操作系统启动了,这些变量就存在,和用户是否登录无关。
当每个用户登录的时候,linux会启动一个用户登录的shell,这个shell会去读取 $HOME/.bash_profile(和$HOME/.bashrc)文件,所以在这些文件中定义的变量,就叫用户变量,是当用户登录成功之后,才会存在的变量。
注意:系统变量和用户变量都是能被登录用户直接使用的,区别仅仅是不同的用户,他们的用户变量可能不一样。
使用 set 命令不带参数,显示结果是:系统变量 + 用户变量
使用 env 命令不带参数,显示结果是:用户变量
使用 export 命令不带参数,显示结果是:被导出成为用户变量的系统变量
使用 declare命令不带参数,结果和 set 一样
useradd新增加一个用户时。都会去 /etc/skel/ 下复制环境文件到$HOME目录
[root@10-8-4-235 ~]# ll -a /etc/skel/
总用量 20
drwxr-xr-x. 2 root root 4096 9月 28 2015 .
drwxr-xr-x. 86 root root 4096 11月 9 14:44 ..
-rw-r--r-- 1 root root 18 7月 24 2015 .bash_logout
-rw-r--r-- 1 root root 176 7月 24 2015 .bash_profile
-rw-r--r-- 1 root root 124 7月 24 2015 .bashrc
/etc/skel/目录下自己增加文件也会复制到新用户那。由 /etc/default/useradd控制
useradd -D 修改默认值等于直接vi修改 /etc/default/useradd 文件内容
[root@10-8-4-235 ~]# cat /etc/default/useradd
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
[kettle3306@10-8-4-235 ~]$ ll /etc/login.defs
[kettle3306@10-8-4-235 ~]$ man login.defs
login.defs - shadow password suite configuration
常见的环境变量
PATH:决定了shell将到哪些目录中寻找命令或程序
HOME:当前用户主目录
MAIL:是指当前用户的邮件存放目录。
SHELL:是指当前用户用的是哪种Shell。
HISTSIZE:是指保存历史命令记录的条数
LOGNAME:是指当前用户的登录名。
HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。
LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。
PS1:是基本提示符,对于root用户是#,对于普通用户是$。
PS2:是附属提示符,默认是“>”
[root@localhost root]# set|grep -i ps1
PS1='[\u@\h \W]\$ '
===================================================================================
[root@localhost root]# aaa=bbb
[root@localhost root]# echo $aaa
bbb
[root@localhost root]# set |grep aaa
aaa=bbb
[root@localhost root]# env |grep aaa
[root@localhost root]# export aaa
[root@localhost root]# env |grep aaa
aaa=bbb
set 显示当前shell的变量,包括当前用户的变量
env 显示当前用户的变量
export 显示当前导出成用户变量的shell变量
每个shell都有自己特有的变量,这和用户变量是不同的。当前用户变量和你用什么shell无关,不管你用什么shell都是存在的。比如HOME,SHELL等这些变量,但shell自己的变量,不同的shell是不同的,比如BASH_ARGC, BASH等,这些变量只有set才会显示,是bash特有的。export不加参数的时候,显示哪些变量被导出成了用户变量,因为一个shell自己的变量可以通过export “导出”变成一个用户变量。