ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

神奇的环境变量

神奇的环境变量

神奇的环境变量

经过前几章的学习,我们知道查阅文件属性的指令ls完整文件名为:/bin/ls(这是绝对路径), 那你会不会觉得很奇怪:“为什么我可以在任何地方执行/bin/ls这个指令呢? ” 为什么我在任何目录下输入 ls 就一定可以显示出一些讯息而不会说找不到该 /bin/ls 指令呢?

这就要引出我们今天要了解的环境变量PATH了

当我们在执行一个指令的时候,举例来说“ls”好了,系统会依照PATH的设置去每个PATH定义的目录下搜寻文件名为ls的可可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可可执行文件,那么先搜寻到的同名指令先被执行!

  • 我们现在下达echo $PATH来查看都有哪些目录被定义出来了($意为后面接的是变量,因而显示出目前的PATH)
btc@btc:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开, 每个目录是有“顺序”之分的。仔细看一下上面的输出,你可以发现到无论是root还是dmtsai都有 /bin 或 /usr/bin 这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls可执行文件啰!因为 /bin 在 ubuntu 当中,就是链接到 /usr/bin 去的! 所以这两个目录内容会一模一样!

例题:假设你是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

某些情况下,即使你已经将 ls 搬回 /bin 了,不过系统还是会告知你无法处理 /root/ls 喔!很可能是因为指令参数被高速缓存的关系。 不要紧张,只要登出 (exit) 再登陆 (su -) 就可以继续快乐的使用 ls 了!

ps:不要轻易尝试!不要轻易尝试!不要轻易尝试!容易改不回来!

btc@btc:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
btc@btc:~$  su -
密码: 
root@btc:~# mv /bin/ls /root/ls
root@btc:~# ls
找不到命令 “ls”,但可以通过以下软件包安装它:
apt install coreutils
root@btc:~# PATH="${PATH}:/root"
root@btc:~# ls
ls  snap
root@btc:~# mv /root/ls /bin/ls
root@btc:~# ls
-bash: /root/ls: 没有那个文件或目录
root@btc:~# pwd
/root
root@btc:~# PATH="${PATH}:/bin"
root@btc:~# ls
snap
root@btc:~# pwd
/root
root@btc:~# cd
root@btc:~# pwd
/root
root@btc:~# chmod 755 /bin/ls
root@btc:~# ls
snap
root@btc:~# /bin/ls
snap
root@btc:~# which ls
/usr/bin/ls
root@btc:~# ls /
bin                home               mnt    sbin                test
bin.usr-is-merged  lib                nihao  sbin.usr-is-merged  test1
boot               lib64              opt    snap                test.txt
cdrom              lib.usr-is-merged  proc   srv                 tmp
dev                lost+found         root   swap.img            usr
etc                media              run    sys                 var
root@btc:~# nano ~/.bashrc
root@btc:~# exit
注销
btc@btc:~$ nano ~/.bashrc
btc@btc:~$ ls
1.txt  公共  模板  视频  图片  文档  下载  音乐  桌面  snap
btc@btc:~$ echo $pathbtc@btc:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
btc@btc:~$ which ls
/usr/bin/ls
btc@btc:~$ whoami
btc
btc@btc:~$ pwd
/home/btc
btc@btc:~$ 
返回列表