以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 “导出”变成一个用户变量。