bashrc 中的 PATH 首选项

bashrc 中的 PATH 首选项

我想知道在以下情况下会发生什么。假设我在 .bashrc 中的 PATH 目录中有一个可执行文件。如果我将该文件复制到也在 PATH 中设置的另一个目录中,并从终端执行该文件,我运行的是哪个副本?

我可以设置一个首选项,比如“如果一个文件在 PATH 中的多个位置存在,则首先执行该文件,而不是在第二个位置执行它”吗?

答案1

快速答案

要找出bash将尝试执行哪个副本,请使用 bash 的内置实用程序。例如,type要找出将执行的哪个副本,请运行:du

$ type du
du is /usr/bin/du

理论

当你要求bash执行某件事时,bash会执行两个步骤:

首先,它会检查缓存中文件的位置。这是可执行文件名称的列表,以及上次bash执行文件时文件所在的位置。

其次,如果文件不在缓存中,它会检查路径,从左到右搜索路径中的每个目录。

请注意,答案取决于在执行复制之前,您是否恰好在当前 shell 中运行了可执行文件。如果是这样,bash可能已将其位置保存在缓存中,并且它将忽略复制后,该文件可能位于任何新位置。如果该文件不在缓存中,则执行哪个文件仅取决于路径中目录的顺序。

更多细节

要查看 bash 当前缓存中的内容,请运行:

$ declare -p BASH_CMDS
declare -A BASH_CMDS='([du]="/usr/bin/du" )'

上面显示只有du当我运行该命令时缓存中才有。如果我执行更多命令然后再次运行该命令,缓存中就会有更多内容。

要查看当前路径,请运行:

$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:/usr/X11R6/bin

路径是一个以冒号分隔的列表。上面显示了路径中的五个目录。它们将从左侧开始向右搜索。

我可以设置偏好吗?

是的,您可以更改路径中目录的顺序。

或者,对于交互式工作,您可以设置别名。例如:

$ alias dd=/opt/bin/dd

设置完上述别名后,您可以dd在命令行中输入,bash将会忽略缓存并忽略PATH,然后运行(或尝试运行)/opt/bin/dd

相关内容