环境变量和命令的执行步骤

  变量是计算机系统用于保存可变值的数据类型。在Linux 系统中,变量名称一般都是大写的,这是一种约定俗成的规范。我们可以直接通过变量名称来提取到对应的变量值。Linux系统中的环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录、邮件存放位置等。

  要想让Linux 系统能够正常运行并且为用户提供服务,需要数百个环境变量来协同工作,我们没有必要逐一查看、学习每一个变量,而是应该在有限的篇幅中学习最重要的内容。

  前文中曾经讲到,在Linux 系统中一切都是文件,Linux 命令也不例外。那么,在用户执行了一条命令之后,Linux 系统中到底发生了什么事情呢?简单来说,命令在Linux 中的执行分为4 个步骤:

  1.判断用户是否以绝对路径或相对路径的方式输入命令(如/bin/ls),如果是的话则直接执行。

  2.Linux 系统检查用户输入的命令是否为别名命令,即用一个自定义的命令名称来替换原本的命令名称。可以用alias 命令来创建一个属于自己的命令别名,格式为alias 别名=命令。若要取消一个命令别名,则是用unalias 命令,格式为unalias 别名。我们之前在使用rm 命令删除文件时,Linux 系统都会要求我们再确认是否执行删除操作,其实这就是Linux 系统为了防止用户误删除文件而特意设置的rm 别名命令,接下来我们把它取消掉:

[root@lynchj tmp]# ll
total 48
-rw-r--r--. 1 root root    58 May 15 17:00 readme.txt
-rw-r--r--. 1 root root 42799 May 15 14:42 tmp.txt
[root@lynchj tmp]# rm readme.txt
rm: remove regular file ‘readme.txt’? y
[root@lynchj tmp]# alias rm
alias rm='rm -i'
[root@lynchj tmp]# unalias rm
[root@lynchj tmp]# rm tmp.txt

  3.Bash 解释器判断用户输入的是内部命令还是外部命令。内部命令是解释器内部的指令,会被直接执行;而用户在绝大部分时间输入的是外部命令,这些命令交由步骤4 继续处理。可以使用type 命令名称来判断用户输入的命令是内部命令还是外部命令。

  4.系统在多个路径中查找用户输入的命令文件,而定义这些路径的变量叫作PATH,可以简单地把它理解成是解释器的小助手,作用是告诉Bash 解释器待执行的命令可能存放的位置,然后Bash 解释器就会乖乖地在这些位置中逐个查找。PATH 是由多个路径值组成的变量,每个路径值之间用冒号间隔,对这些路径的增加和删除操作将影响到Bash 解释器对Linux 命令的查找。

[root@lynchj tmp]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@lynchj tmp]# PATH=$PATH:/root/bin
[root@lynchj tmp]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin

  这里有比较经典的问题:“为什么不能将当前目录(.)添加到PATH 中呢? ” 原因是,尽管可以将当前目录(.)添加到PATH 变量中,从而在某些情况下可以让用户免去输入命令所在路径的麻烦。但是,如果黑客在比较常用的公共目录/tmp 中存放了一个与ls 或cd 命令同名的木马文件,而用户又恰巧在公共目录中执行了这些命令,那么就极有可能中招了。
  所以,作为一名态度谨慎、有经验的运维人员,在接手了一台Linux 系统后一定会在执行命令前先检查PATH 变量中是否有可疑的目录。

  我们可以使用env 命令来查看到Linux 系统中所有的环境变量,这里也列举下比较重要的一些环境变量:

变量名称作用
HOME用户的主目录(即家目录)
SHELL用户在使用的Shell 解释器名称
HISTSIZE输出的历史命令记录条数
HISTFILESIZE保存的历史命令记录条数
MAIL邮件保存路径
LANG系统语言、语系名称
RANDOM生成一个随机数字
PS1Bash 解释器的提示符
PATH定义解释器搜索用户执行命令的路径
EDITOR用户默认的文本编辑器

  Linux 作为一个多用户多任务的操作系统,能够为每个用户提供独立的、合适的工作运行环境,因此,一个相同的变量会因为用户身份的不同而具有不同的值。例如,我们使用下述命令来查看HOME 变量在不同用户身份下都有哪些值(su 是用于切换用户身份的命令):

[root@lynchj tmp]# echo $HOME
/root
[root@lynchj ~]# su - guoqingsong
Last login: Wed May 16 10:53:28 CST 2018 on pts/0
[guoqingsong@lynchj tmp]$ echo $HOME
/home/guoqingsong

  其实变量是由固定的变量名与用户或系统设置的变量值两部分组成的,我们完全可以自行创建变量,来满足工作需求。例如设置一个名称为WORKDIR 的变量,方便用户更轻松地进入一个层次较深的目录:

[root@lynchj ~]# mkdir /home/workdir
[root@lynchj ~]# WORKDIR=/home/workdir
[root@lynchj ~]# cd $WORKDIR
[root@lynchj workdir]# pwd
/home/workdir

  但是,这样的变量不具有全局性,作用范围也有限,默认情况下不能被其他用户使用。如果工作需要,可以使用export 命令将其提升为全局变量,这样其他用户也就可以使用它了:

[root@lynchj workdir]# su - guoqignsong
Last login: Wed May 16 10:55:28 CST 2018 on pts/0
[guoqignsong@lynchj ~]$ cd $WORKDIR
[guoqignsong@lynchj ~]$ echo $WORKDIR
[guoqignsong@lynchj ~]$ exit
logout
[root@lynchj ~]# export WORKDIR
[root@lynchj ~]# su - guoqignsong
Last login: Wed May 16 10:56:28 CST 2018 on pts/0
[guoqignsong@lynchj ~]$ cd $WORKDIR
[guoqignsong@lynchj ~]$ workdir]$ pwd
/home/workdir

参考资料:《Linux就该这么学》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值