我们知道查阅文件属性的指令ls完整文件名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:“为什么我可以在任何地方执行/bin/ls这个指令呢? ” 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致呀!
当我们在执行一个指令的时候,举例来说“ls”好了,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行!
现在,请下达“echo $PATH”来看看到底有哪些目录被定义出来了? echo有“显示、印出”的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前的 PATH !
[root@localhost 123]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/jdk-17.0.0.1/bin:/root/bin
PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有“顺序”之分的。仔细看一下上面的输出,你可以发现到无论是root还是dmtsai都有 /bin 或 /usr/bin 这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls可执行文件啰!因为 /bin 在 CentOS 7 当中,就是链接到 /usr/bin 去的! 所以这两个目录内容会一模一样!
我们用几个范例来让你了解一下,为什么PATH是那么重要的项目!
例题:假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用“mv /bin/ls /root”指令达成),然后你自己本身也在/root目录下, 请问(1)你能不能直接输入ls来执行?(2)若不能,你该如何执行ls这个指令?(3)若要直接输入ls即可执行,又该如何进行?答:由于这个例题的重点是将某个可执行文件移动到非正规目录去,所以我们先要进行下面的动作才行:(务必先使用 su - 切换成为root的身份)
[root@study ~]# mv /bin/ls /root
# mv 为移动,可将文件在不同的目录间进行移动作业
(1)接下来不论你在那个目录下面输入任何与ls相关的指令,都没有办法顺利的执行ls了! 也就是说,你不能直接输入ls来执行,因为/root这个目录并不在PATH指定的目录中, 所以,即使你在/root目录下,也不能够搜寻到ls这个指令!
(2)因为这个ls确实存在于/root下面,并不是被删除了!所以我们可以通过使用绝对路径或者是相对路径直接指定这个可执行文件文件名, 下面的两个方法都能够执行ls这个指令:
root@study ~]# /root/ls <==直接用绝对路径指定该文件名
[root@study ~]# ./ls <==因为在 /root 目录下,就用./ls来指定
(3)如果想要让root在任何目录均可执行/root下面的ls,那么就将/root加入PATH当中即可。 加入的方法很简单,就像下面这样:
[root@study ~]# PATH="${PATH}:/root"
上面这个作法就能够将/root加入到可执行文件搜寻路径PATH中了!不相信的话请您自行使用“echo $PATH”去查看吧! 另外,除了 $PATH 之外,如果想要更明确的定义出变量的名称,可以使用大括号 ${PATH} 来处理变量的调用喔! 如果确定这个例题进行没有问题了,请将ls搬回/bin下面,不然系统会挂点的!
[root@study ~]# mv /root/ls /bin