Linux——关于执行文件路径的变量($PATH)

查阅文件属性的指令 ls 完整文件名为:/bin/ls(这是绝对路径), 会不会觉得很奇怪:『为什么可在任何地方执行/bin/ls 这个指令呢? 』 为什么在任何目录下输入 ls  就一定可以显示出一些讯息而不会说找不到该 /bin/ls  指令呢? 这是因为环境变量PATH 的帮助所致呀!当我们在执行一个指令的时候,举例来说『ls』好了,系统会依照 PATH 的设定去每个 PATH 定义的目录下搜寻文件名为 ls 的可执行文件, 如果在 PATH 定义的目录中含有多个文件名为 ls 的可执行文件,那么先搜寻到的同名指令先被执行!

现在,请下达『echo $PATH』来看看到底有哪些目录被定义出来了? echo 有『显示、印出』的意思, PATH 前面加的 表示后面接的是变量,所以会显示出目前的 PATH

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 来切换到不同的目录), 因此能够执行的指令会有变动(因为每个目录底下的可执行文件都不相同嘛!),这对使用者来说并非好事。

另外,如果有个坏心使用者在/tmp 底下做了一个指令,因为/tmp 是大家都能够写入的环境,所以他当然可以这样做。 假设该指令可能会窃取用户的一些数据,如果你使用 root 的身份来执行这个指令,那不是很糟糕? 如果这个指令的名称又是经常会被用到的 ls 时,那『中标』的机率就更高了!

所以,为了安全起见,不建议将『.』加入PATH 的搜寻目录中。

而由上面的几个例题我们也可以知道几件事情:

  • 不同身份使用者预设的PATH 不同,默认能够随意执行的指令也不同(root dmtsai)
  • PATH 是可以修改的
  • 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH 来的正确;
  • 指令应该要放置到正确的目录下,执行才会比较方便;
  • 本目录(.)最好不要放到PATH 当中。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章