我们知道 Linux 中一切皆文件,那么命令当然也是一个文件了,那么比如我们执行一个 ls 命令时,系统是怎么知道这个 ls 命令的二进制文件在哪呢?
下面我们来分析系统是怎么一步步找到对应的命令文件:
1、如果用户输入的是一个绝对路径的命令,比如 /bin/ls ,那么就是直接执行了。 如果是相对路径,则进入第2步。
2、检查用户输入的命令是否是一个别名命令,比如 rm ,其实就是一个别名,真正要执行的命令是 rm -i
3、bash解释器,判断这个命令是否是内建命令,如果是bash内置的,则直接执行。 如果是外部命令,则进入第4步。
我们可以用 type 命令
来得知这个命令是内建的,还是外部的。
type echo
type uptime
4、bash解释器,从 PATH 环境变量中,获取多个地址,然后从前往后,在这些地址中,挨个的寻找命令文件,如果找到了,就终止寻找,然后用这个二进制文件来作为命令执行。
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin // 可以看出,用 : 分割的多个地址
// 我们可以修改 PATH
PATH=$PATH:/root/bin
// 再次查看
echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/root/bin:/root/bin
当然了,增加或删除 PATH 中的地址,会直接影响到 bash解释器 对命令的查找。
注意:对应环境变量,一般不要轻易更改,除非你知道自己在做什么?
一个经典问题:为什么不要将 .
(当前目录) ,添加到 PATH 中 ?
我们确实可以将 .
加入到 PATH 中,然后当前目录下的命令,不用路径就可以直接输入了,看起来好像确实有点用。 但是这样会导致系统不安全, 加入 /tmp/ 下有个 ls 的木马文件, 当我们在 /tmp/ 下执行 ls 时, 那么就是直接执行了这个木马文件了。