Linux Shell如何查找命令

在Linux Shell(例如bash)中输入ls,系统会显示当前目录的文件列表,但当你直接输入一个你自己开发的程序的文件名时,系统会提示找不到该文件,这是为什么呢?Shell中有一个叫PATH的环境变量,当输入命令时,系统会在PATH包含的路径列表中依次查找该命令,如果找到就立即执行。如果你自己编写的命令没有包含在PATH中,系统就提示找不到了。这时,就需要显式的指定文件路径,例如”./xxx”表示执行当前目录下的xxx文件。为了在任意目录中方便的执行xxx文件,我们可以将它添加到PATH当中。以bash为例,在~/.bash_profile中添加PATH=$PATH:custom_path

当PATH环境变量包含的路径很多,且每个路径下的文件都很多时,每次查找需要的时间累积起来其实是挺多的。Shell的优化策略是增加缓存,很容易想到是通过hash表的方式,将命令名作为key,路径作为value。不同Shell的实现策略不同,以bash为例,内置了hash命令。hash表数据是缓存在内存中的,每个会话都是不同的缓存,此处可以ssh登录到一台远程Linux主机实验。

如图所示

如上图所示,刚登录时hash表为空,没执行一个新命令hash表会增加一条记录,执行hash -r会清除hash表。

为什么需要注意这个机制呢?如果对Python virtualenv有了解的话,就会明白,每次切换Python的版本就需要重建hash表,否则缓存的还是旧版本Python的路径。

不同的shell对hash的实现细节可能不同,但原理都是相同的。

Bash

 hash [-r] [-p filename] [-dt] [name]

Zsh

hash [ -Ldfmrv ] [ name[=value] ] ...