在 bash(或任何其他 shell)中,当您输入“firefox”或其他命令时,bash 如何将其指向其实际位置 (/usr/bin/firefox)?此外,bash 自动完成的“目录”在哪里?
答案1
有一个$PATH
变量保存了所有路径(以冒号分隔)以查找命令名称。这些文件夹会从第一个到最后一个进行检查,找到后执行命令(因此,如果不同$PATH
目录中有多个同名文件,则将执行第一个文件)。
查看$PATH
:
echo $PATH
检查位置firefox
:
which firefox
答案2
bash
和其他 shell 和命令处理器搜索你的PATH
目录,寻找与您输入的命令名匹配的可执行文件。
答案3
其他答案中已经给出了要点。从技术上讲,shell 将命令的位置存储在哈希表中。bash
您可以通过以下命令查看此表hash
:
$ hash
hits command
2 /usr/bin/ldd
1 /usr/bin/man
1 /usr/bin/less
您还可以修改此哈希表,有关详细信息,我引用了手册bash
页:
hash [-lr] [-p filename] [-dt] [name]
对于每个名称,通过搜索 $PATH 中的目录来确定命令的完整文件名并记住它。如果提供了 -p 选项,则不执行路径搜索,并且将 filename 用作命令的完整文件名。-r 选项使 shell 忘记所有记住的位置。-d 选项使 shell 忘记每个名称的记住位置。如果提供了 -t 选项,则打印每个名称对应的完整路径名。如果使用 -t 提供了多个名称参数,则在散列的完整路径名之前打印名称。-l 选项使输出以可重用为输入的格式显示。如果没有给出参数,或者只提供了 -l,则打印有关记住的命令的信息。除非未找到名称或提供了无效的选项,否则返回状态为 true。在这里您可以看到您在此会话中已经执行了哪些命令。
其他 shell 的行为可能有所不同,在zsh
(我认为这是从 改编而来的csh
)中,shell 在启动时或通过调用 收集所有命令rehash
。然后,您可以使用 获得所有可用命令的完整列表,hash
并且可以搜索 的所有变体diff
:
zsh$ hash | grep diff
bzdiff=/usr/bin/bzdiff
cdiff=/usr/bin/cdiff
colordiff=/usr/bin/colordiff
diff=/usr/bin/diff
diff3=/usr/bin/diff3
ptardiff=/usr/bin/ptardiff
sdiff=/usr/bin/sdiff
tkdiff=/usr/bin/tkdiff
vimdiff=/usr/bin/vimdiff
xzdiff=/usr/bin/xzdiff
zdiff=/usr/bin/zdiff
再次咨询man zshbuiltins
以了解更多详细信息。
答案4
- bash 使用
$PATH
环境变量按单词查找程序。路径以 分隔:
。您的$PATH
路径很可能类似于:/usr/bin:/usr/games:/usr/local/bin:/usr/local/games:
,因此它会在 中找到它/usr/local/bin
。更改您的$PATH
路径并重试。 - 您可以通过
complete
内置命令更改制表符补全行为。请参阅的“可编程补全”man bash
。