查阅文件属性的指令ls完整文件名为:/bin/ls(绝对路径)。
当我们在执行一个指令的时候,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可可执行文件,如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行。
PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有“顺序”之分的。仔细看一下上面的输出,你可以发现到无论是root还是dmtsai都有 /bin 或 /usr/bin 这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls可执行文件。/bin 在 CentOS 7 当中,就是链接到 /usr/bin 去的,以这两个目录内容会一模一样。
例题:假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用“mv /bin/ls /root”指令达成),然后你自己本身也在/root目录下, 请问(1)你能不能直接输入ls来执行?(2)若不能,你该如何执行ls这个指令?(3)若要直接输入ls即可执行,又该如何进行?答:由于这个例题的重点是将某个可执行文件移动到非正规目录去,所以我们先要进行下面的动作才行:(务必先使用 su - 切换成为root的身份)
(1)接下来不论你在那个目录下面输入任何与ls相关的指令,都没有办法顺利的执行ls了!也就是说,你不能直接输入ls来执行,因为/root这个目录并不在PATH指定的目录中, 所以,即使你在/root目录下,也不能够搜寻到ls这个指令。
(2)因为这个ls确实存在于/root下面,并不是被删除了!所以我们可以通过使用绝对路径或者是相对路径直接指定这个可执行文件文件名, 下面的两个方法都能够执行ls这个指令:
(3)如果想要让root在任何目录均可执行/root下面的ls,那么就将/root加入PATH当中即可。加入的方法很简单,就像下面这样:
上面这个作法就能够将/root加入到可执行文件搜寻路径PATH中了!不相信的话自行使用“echo $PATH”去查看吧! 另外,除了 $PATH 之外,如果想要更明确的定义出变量的名称,可以使用大括号 ${PATH} 来处理变量的调用。最后没有问题,将ls撤回到/bin下面,不然系统会挂点。
某些情况下,即使你已经将 ls 搬回 /bin 了,不过系统还是会告知你无法处理 /root/ls 。很可能是因为指令参数被高速缓存的关系。 不要紧张,只要登出 (exit) 再登陆 (su -) 就可以继续使用 ls。
例题:如果我有两个ls指令在不同的目录中,例如/usr/local/bin/ls与/bin/ls那么当我下达 ls 的时候,哪个ls会被执行?答:那还用说,就找出 ${PATH} 里面哪个目录先被查询,则那个目录下的指令就会被先执行了!所以用 dmtsai 帐号为例,他最先搜寻的是 /usr/local/bin, 所以/usr/local/bin/ls 会先被执行。
例题:为什么 ${PATH} 搜寻的目录不加入本目录(.)?加入本目录的搜寻不是也不错?答:如果在PATH中加入本目录(.)后,确实我们就能够在指令所在目录进行指令的执行了。 但是由于你的工作目录并非固定(常常会使用cd来切换到不同的目录), 因此能够执行的指令会有变动(因为每个目录下面的可可执行文件都不相同嘛!),这对使用者来说并非好事。
为了安全起见,不建议将“.”加入PATH的搜寻目录中。
不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如root与dmtsai);
PATH是可以修改的;
使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确;
指令应该要放置到正确的目录下,执行才会比较方便;
本目录(.)最好不要放到PATH当中。