.1.3 执行文件路径的变量:$PATH
介绍了绝对路径、相对路径与命令的执行方式之后,你应该会注意到一件事情,那就是:“为什么可以在任何地方执行 /bin/ls命令呢?”为什么可以直接执行ls,就一定可以显示出一些信息,而不会说找不到 /bin/ls命令呢?这是因为有环境变量PATH的帮助。在执行命令时,系统会按照PATH的设置,去每个PATH定义的路径下搜索执行文件,先搜索到的命令先执行。现在,请输入命令echo $PATH,echo有“显示”的意思,而PATH前面加的 $ ,表示后面接的是变量,所以就会显示出当前的PATH了。[root@linux ~]# echo $PATH
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
注意到了吗?/bin在PATH的设置中,所以自然就可以找到ls。PATH对于执行文件来说,是个很重要的“变量”,它主要是用来规范命令搜索的目录。每个目录是有顺序的,每个目录中间以冒号“:”来分隔,就如同上面范例中提到的。PATH这个变量还有什么作用呢?
• 如果将ls移动到 /root下面(mv /bin/ls /root),你也在 /root下(cd /root),但是,执行ls的时候,它就是不理你,怎么办?这是因为PATH变量没有 /root目录,而你又将ls移动到 /root下面了,系统自然就找不到可执行文件了,因此就会告诉你,command not found(命令未找到)。那么,该怎么解决这种问题呢?有两个方法,其一:直接将 /root的路径加入PATH中。如何增加?可以使用:[root@linux ~]# PATH="$PATH":/root这种方式来增加PATH搜索目录。另一种方式则是使用完整的文件名来发出命令,即直接使用相对或绝对路径来执行,例如:
[root@linux ~]# /root/ls
[root@linux ~]# ./ls
因为在同一个目录中,而我们又知道在同一个目录中的目录符号为“.”,因此,就以上面的 ./ls来执行也可以。这种执行方式很常见。
• 如果在不同的目录中有两个ls文件,例如 /usr/local/bin/ls与 /bin/ls。那么,使用ls的时候,会执行哪个ls?PATH里哪个目录先查询,则哪个目录下的文件就会先执行。
• 既然如此,为什么不在PATH里加入 . 目录,这样不就可以直接在所在目录执行文件了吗?因为 . 表示所在目录。没错。但是,有没有想过,如果某天,某个用户在 /tmp里写了一个ls文件,偏偏它是有害的文件,那么当你在 /tmp下面执行ls时,怎么办?可能会“中标”,所以,为了安全起见,建议不要将“.”加入PATH的搜索中。
关于更多PATH与相关“变量”及“环境变量”的概念,我们会在第3篇中更深入地介绍。经过上面的说明,你应该了解到:“为什么绝对路径发出命令的方法比相对路径要正确得多”这句话的意义。因为是直接找到该命令来执行,而不是通过PATH变量的内容去搜索。