参考:《鸟哥的Linux私房菜》
一、$PATH 是什么?
我们知道文件属性的命令ls完整文件名为:/bin/ls(这是绝对路径),那你会不会觉得奇怪:“为什么我可以在任何地方执行 /bin/ls 这个命令?”,为什么我在任何目录下输入ls就一定可以显示出一些信息而不会说找不到该 /bin/ls 命令?这是因为环境变量 PATH 的帮助所导致。
当我们在执行一个命令的时候,举例来说 ls 好了,系统会依照 PATH 的设置去每个 PATH 定义的目录下查找文件名为 ls 的可执行文件,如果在 PATH定义的目录中含有多个文件名为 ls 的可执行文件,那么先查找到的同名命令先被执行。
PATH是一个环境变量,用于告诉操作系统在哪里查找可执行文件。当你在命令行中输入一个命令时,如果没有给出完整的路径,系统就会在PATH 中列出的目录里查找该命令对应的可执行文件。需要注意的是 PATH 这个单词必须要大写。
$PATH 通常包含一系列目录路径,这些路径用冒号 (
:
) 分隔。每个路径都代表一个目录,其中包含可执行文件。系统会在这些目录中搜索命令。通常
$PATH
会包含/bin
和/usr/bin
这样的目录,因为这些目录中存放了很多常用的命令。
要查看当前的 $PATH 设置,可以使用 echo
命令:
echo $PATH
输出可能是这样的:
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$PATH
中的每一个目录:
- /usr/local/bin
- /usr/bin:/bin
- /bin
- /usr/local/games
- /usr/games
当你输入 ls
命令时,系统会在 $PATH
中的每一个目录依次查找是否存在一个名为 ls
的可执行文件。第一个找到的 ls
命令将会被执行。由于 /bin
通常包含在 $PATH
的最前面,因此系统会在 /bin
目录中找到 ls
并执行它。
二、例题
2.1 问题一
假设你是root,如果你将 ls 由 /bin/ls 移动成为 /root/ls (可用【mv /bin/ls /root】),然后你自己本身也在 /root 目录下,请问①你能不能直接输入 ls 来执行? ②若不能,你该如何执行 ls 这个命令?③若要直接输入 ls 即可执行,又该如何进行?
(1)答:不能,当你将 ls
命令从 /bin/ls
移动到 /root/ls
后,/bin/ls
不再存在于 $PATH
中。
默认情况下,/root
目录不在 $PATH
中,因此系统不会在 /root
目录中查找 ls
命令。
(2) 答:方法一:使用完整的路径来执行命令
./ls
方法二: 使用绝对路径执行命令
/root/ls
(3)答:若要直接执行 ls ,需要修改 $PATH,为了能够在任何目录下直接输入 ls
并执行 /root/ls
,你需要将 /root
添加到 $PATH
中。
方法一:在 Ubuntu 系统中,你可以编辑 /etc/environment
文件来全局修改 $PATH
,或者在用户的 shell 配置文件中(例如 .bashrc
或 .bash_profile
)添加以下内容:
export PATH=$PATH:/root
然后执行以下命令来使修改生效:
source ~/.bashrc
或者重新打开一个终端窗口,这样 $PATH
就会包含 /root
目录。
方法二:在终端中直接设置(这将只在当前会话中有效):
export PATH=$PATH:/root
重新加载配置文件或打开新的终端会话后,你就可以直接输入 ls
来执行 /root/ls
了。
2.2 问题二
为什么${PATH}查找的目录不加入本目录(.)?加入本目录的查找不是也不错?
在大多数 Unix-like 系统中,默认情况下 $PATH
变量并不包含当前目录(.
)。 这是出于安全和系统管理的考虑。
如果 $PATH
中包含当前目录(.
),那么用户在任何目录下都可以通过输入命令名来执行该目录下的可执行文件。这可能导致执行恶意程序的风险增加,特别是如果用户在不受信任的环境中工作。
如果当前目录中有一个与系统命令同名的可执行文件,那么这个文件可能会被优先执行,而不是系统提供的标准命令。这可能导致意外的行为或安全漏洞。
用户可能无意中在当前目录放置了一个与系统命令同名的可执行文件,这会导致系统命令被覆盖,从而产生不可预测的结果。例如,如果用户不小心在当前目录下放置了一个名为 ls
的脚本,那么每次输入 ls
时都会执行这个脚本,而不是系统提供的 ls
命令。
三、总结
-
不同身份用户默认的 PATH 不同,默认能够随意执行的命令也不同
-
使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查找PATH来的正确
-
命令应该放置到正确的目录下,执行才会比较方便
-
本目录(.)最好不要放到 PATH 中