变量是计算机系统用于保存可变值的数据类型。在
Linux
系统中,
变量名称一般都是大写的
,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。
在
Linux
系统中一切都是文件,
Linux
命令也不例外。那么,在用户执行了一条命令之后,Linux
系统中到底发生了什么事情呢?简单来说,命令在
Linux
中的执行分为 4
个步骤。
第1步
:判断用户是否以绝对路径或相对路径的方式输入命令(如
/bin/ls
),如果是的话则直接执行。
第2步:
Linux
系统检查用户输入的命令是否为“别名命令”,即用一个自定义的命令名称来替换原本的命令名称。可以用
alias 命令来创建一个属于自己的命令别名,格式为“alias rm= rm -i”或者
“alias 别名=命令”,若要取消一个命令别名,则是用 unalias 命令,格式为“unalias 别名”。我们之前在使用 rm 命令删除文件时,Linux 系统都会要求我们再确认是否执行删除操作,其实这就是 Linux 系统为了防止用户误删除文件而特意设置的 rm 别名命令,接下来我们把它取消掉:
[root@localhost ~]# ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
[root@localhost ~]# rm anaconda-ks.cfg
rm: remove regular file ‘anaconda-ks.cfg’? y
[root@localhost ~]# alias rm
alias rm='rm -i'
[root@localhost ~]# unalias rm
第3步: Bash 解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤 4 继续处理。可以使用“type 命令名称”来判断用户输入的命令是内部命令还是外部命令。
第4步
:系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作
PATH
,可以简单地把它理解成是“解释器的小助手”,作用是告诉 Bash
解释器待执行的命令可能存放的位置,然后 Bash
解释器就会乖乖地在这些位置中逐个查找。
PATH
是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到 Bash
解释器对Linux 命令的查找。
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# PATH=$PATH:/root/bin
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin
这里有比较经典的问题:“为什么不能将当前目录(
.
)添加到
PATH
中呢
?
” 原因是,尽管可以将当前目录(.
)添加到
PATH
变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp
中存放了一个与
ls
或
cd
命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。所以,作为一名态度谨慎、有经验的运维人员,在接手了一台 Linux
系统后一定会在执行命令前先检查 PATH
变量中是否有可疑的目录,另外从前面的
PATH
变量示例中是否也感觉到环境变量特别有用呢。我们可以使用 env
命令来查看到 Linux 系统中所有的环境变量。
![](https://i-blog.csdnimg.cn/blog_migrate/4a4111de67e0ab967054028b1bd4c2d9.png)
[root@localhost zhangxu]# echo $HOME
/root
[root@localhost zhangxu]# su zhangxu
[zhangxu@localhost ~]$ echo $HOME
/home/zhangxu
其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,完全可以自行创建变量,来满足工作需求。例如设置一个名称为 WORKDIR
的变量,方便用户更轻松地进入一个层次较深的目录:
[root@localhost zhangxu]# mkdir /home/work
[root@localhost zhangxu]# WORK=/home/work
[root@localhost zhangxu]# cd $WORK
[root@localhost work]# pwd
/home/work
但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用
export 命令
将其提升为全局变量,这样其他用户也就可以使用它了:
[root@localhost work]# su zhangxu
[zhangxu@localhost work]$ cd $WORK
[zhangxu@localhost ~]$ echo $WORk
[zhangxu@localhost ~]$ exit
exit
[root@localhost work]# export WORK
[root@localhost work]# su zhangxu
[zhangxu@localhost work]$ cd $WORK
[zhangxu@localhost work]$ pwd
/home/work