【Linux学习笔记】26:环境变量
环境变量是全局变量,而用户自定义变量是局部变量。也就是说,用户自定义变量只能再当前Shell中生效,而环境变量可以在当前Shell和这个Shell的所有子Shell中生效。
[1]先用pstree命令查看进程树
[aaa@qq.com ~]# pstree
init─┬─abrtd
├─acpid
├─atd
├─auditd───{auditd}
├─automount───4*[{automount}]
├─certmonger
├─crond
├─cupsd
├─dbus-daemon───{dbus-daemon}
├─hald───hald-runner─┬─hald-addon-acpi
│ └─hald-addon-inpu
├─master─┬─pickup
│ └─qmgr
├─mcelog
├─6*[mingetty]
├─rhsmcertd
├─rpc.idmapd
├─rpc.statd
├─rpcbind
├─rsyslogd───3*[{rsyslogd}]
├─sshd───sshd───bash───pstree
└─udevd───2*[udevd]
[aaa@qq.com ~]# bash
[aaa@qq.com ~]# pstree
init─┬─abrtd
├─acpid
├─atd
├─auditd───{auditd}
├─automount───4*[{automount}]
├─certmonger
├─crond
├─cupsd
├─dbus-daemon───{dbus-daemon}
├─hald───hald-runner─┬─hald-addon-acpi
│ └─hald-addon-inpu
├─master─┬─pickup
│ └─qmgr
├─mcelog
├─6*[mingetty]
├─rhsmcertd
├─rpc.idmapd
├─rpc.statd
├─rpcbind
├─rsyslogd───3*[{rsyslogd}]
├─sshd───sshd───bash───bash───pstree
└─udevd───2*[udevd]
可以看到是从原来那个Bash Shell进入了一个子的Bash Shell,然后在子的Bash里面执行了pstree命令。
退出子shell:
[root@bogon ~]# exit
exit
[2]环境变量分类
环境变量也分为可以自定义的和对系统生效的,对系统生效的环境变量变量名和变量作用是固定的。
[3]自定义环境变量
export将这个变量声明为环境变量:
export 变量名=变量值
也可以先声明为用户自定义变量(本地变量),再声明为环境变量:
变量名=变量值
export 变量名
[4]测试本地变量和环境变量作用域
[root@bogon ~]# x=1
[root@bogon ~]# y=2
[root@bogon ~]# z=3
[root@bogon ~]# export h=4
[root@bogon ~]# export z
[root@bogon ~]# pstree
[root@bogon ~]# set
[root@bogon ~]# bash
[root@bogon ~]# pstree
注意这是在子Bash里看的pstree。
[root@bogon ~]# set
注意这是在子Bash里看的set。
可以看到父Shell的用户自定义变量(属本地变量)在子Shell里没法使用。
[5]env查看环境变量
(词汇:envirment)
[6]删除自定义的环境变量
和删除用户自定义变量的格式是一样的。
unset 变量名
在子Shell中删除环境变量不影响(定义这个环境变量的)父Shell,回到(定义这个环境变量的)父Shell中去还是能看到这个变量,而且重新进入一个子Shell环境变量依然存在,要想彻底删除应在定义这个环境变量的Shell中删除。
[7]对系统生效的环境变量
前面说的自定义的环境变量用途不大,常用的是对系统生效的环境变量,下面是常用的对系统生效的环境变量。
因为Linux中没有大写命令,为了怕环境变量和系统命令有名称上的冲突,以及保持可读性,建议环境变量都用大写的。
[8]PATH环境变量
可以看到是冒号分隔的一些目录,这是系统搜索命令的路径。
当我们直接敲命令名,而没有去指定路径时,系统就会去这些目录中去找,找到了就会执行(Tab键搜索命令也是按照这个路径)。如果这个值不对,就会发现原本很多可以直接打命令名称执行的命令都必须去用绝对路径执行了。(我在第一节中windows下出现过这个错误)
当写了一个脚本并赋予权限后,可以用相对路径或绝对路径执行:
[root@bogon ~]# vi hello.sh
[root@bogon ~]# chmod 755 hello.sh
[root@bogon ~]# ./hello.sh
lzh is a dsb
[root@bogon ~]# /root/hello.sh
lzh is a dsb
而要想让它能直接执行,就可以把它复制到任意环境变量中去:
[root@bogon ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@bogon ~]# cp hello.sh /bin/
[root@bogon ~]# hello.sh
lzh is a dsb
[root@bogon ~]# cd /tmp/
[root@bogon tmp]# hello.sh
lzh is a dsb
这里是复制到/bin/下,可以看到在哪个目录中都可以直接执行这个脚本了。
但这样做,不方便增删查改,另一个方式是建立一个专门存这些要直接执行的脚本的目录,把目录加到PATH环境变量中去:
[root@bogon ~]# PATH="$PATH":/root
这是用上一节学的变量叠加的方式,现在再查看一下PATH环境变量:
[aaa@qq.com ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root
可以看到/root目录就被加到末尾了,这时候就可以直接执行所有/root下的脚本了。可惜的是,这样做只是临时生效的(重启就恢复了),要想让加入的目录永久生效,当然要写到对应的文件中去,后面会学。
[9]PS1环境变量
这个环境变量用env命令是看不到的,用set才能看到(完整的环境变量和其它变量)。
它定义的就是当前操作系统的提示符,\u表示当前登录用户,\h表示简写主机名,\W表示当前所在目录的最后一个目录,$表示提示符(超级用户的提示符是#,普通用户的提示符是$)。
从视频里截取的,另外还能识别的部分转义符如下:
通过利用这些转义符,去更改PS1环境变量单引号里的内容,就更改了当前操作系统的提示符,如去显示时间等。
[root@bogon ~]# PS1='[\aaa@qq.com\A \w]\$ '
[root@03:55 ~]# cd /usr/local/src/
[root@03:55 /usr/local/src]#
可以看到操作系统提示符改变了,再改回来:
[root@03:55 /usr/local/src]# PS1='[\aaa@qq.com\h \W]\$ '
[root@bogon src]# cd ~
[root@bogon ~]#
同样地,这种更改只是临时的,要想永久生效就要修改对应的文件。
[10]PS2环境变量
有的命令很长,一行输入不下时候,在后面输反斜杠表示我的命令还没输出完成,这时候会跳出一个提示符,并让你继续输完那个命令后面的内容,这时候的提示符就是PS2环境变量所定义的。
如换行输入date命令时:
[aaa@qq.com ~]# da\
> te
2017年 09月 03日 星期日 04:02:48 CST
修改PS2环境变量,再换行输入date命令:
[root@bogon ~]# PS2='* '
[root@bogon ~]# da\
* te
2017年 09月 03日 星期日 04:04:16 CST
可以看到提示符由’> ‘被修改成了’* ‘。