bash 中列出的程序目录

bash 中列出的程序目录

在 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

  1. bash 使用$PATH环境变量按单词查找程序。路径以 分隔:。您的$PATH路径很可能类似于:/usr/bin:/usr/games:/usr/local/bin:/usr/local/games:,因此它会在 中找到它/usr/local/bin。更改您的$PATH路径并重试。
  2. 您可以通过complete内置命令更改制表符补全行为。请参阅的“可编程补全” man bash

相关内容