我想知道在以下情况下会发生什么。假设我在 .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
。