Unix如何搜索可执行文件?


46

执行文件后,Unix如何搜索它?如果PATH中有多个具有相同名称的可执行文件,则首选哪个?执行文件时,当前目录是否包括在搜索中?

假设executable.sh在当前目录中有一个文件名为。如果执行了该工作$ executed并且.不属于该工作,该行PATH吗?


提到which <executable>命令将在此线程中有用。
会计师م

Answers:


44

从头到尾搜索$ PATH,并运行第一个匹配的可执行文件。因此,$ PATH开头的目录优先于后面的目录。当前目录(。)中的可执行文件仅在时执行。在$ PATH中(通常不是)。搜索路径中没有隐式包含当前目录。


奇怪的是,我的$ PATH不包含.,但是似乎会先从当前目录搜索,然后再检查$ PATH本身定义的检查目录。
艾瑞克·王

19

对于当前目录中的文件,您需要在它们之前加上./,因此命令将变为./executable.sh。您不应该.在PATH中使用它,因为它会带来安全风险以及其他问题。

目录在PATH中排在首位,并且首先搜索。

如果我没有记错的话,搜索的总体顺序如下:

  • 别名

  • 导出功能

  • 内置的shell命令

  • PATH中的脚本和二进制文件


7
我要添加哈希值-记住bash(可能还有其他shell)保留最近使用的命令的哈希值,以使查找它们变得更加容易。有时,hash -r如果您更改PATH或程序位置,则必须清除缓存(使用)。
Rich Homolka

3
+1为搜索顺序。如果您能记住信息源,那就太好了:)
twan163 '16

8

尽管其他一些人已经很好地回答了这个问题,但我想补充一些想法:

1)仅当调用的可执行文件中没有路径元素时,才查询PATH。将在$ PATH ./somecommand或中查找somecommand /usr/bin/somecommand,或../../bin/somecommand仅使用目录规则,而不是PATH

如果PATH中有多个具有相同名称的可执行文件,则首选哪个?

它从找到的第一个停止,从左到右读取$ PATH。

执行文件时搜索中是否包含当前目录?

如果当前目录在PATH中,则将对其进行搜索。请记住,PATH中的空目录包括当前目录。例如,PATH =:/ usr / bin(前导为空)PATH = / usr / bin :(后导为空)和PATH = / usr / bin :: // bin(中为空)都将有效地包含当前工作目录。

假设当前目录中有一个文件名为“ executable.sh”。如果执行$ $并且执行。不是PATH的一部分吗?

它永远不会通过搜索PATH找到它。如果当前目录不在PATH中,则无法通过PATH查找找到它。

就是说(很抱歉,造成混乱),如果有别名或函数运行了该命令,它将被运行。或者,如果您的Shell具有位置缓存,并且可执行文件位于缓存中,则它可能会找到它。因此,它永远不会在PATH中找到它,但是可以通过其他方式运行它。


感谢您的cache来信,几乎让我感到疯狂的是,旧的可执行文件/usr/bin/仍然被调用,而不是新的可执行文件/usr/local/bin,但是在$PATH我注销并再次登录之前,它位于左侧。
会计师م

1
@theaccountant在bash中,您可以执行'hash -r'清除shell缓存
Rich Homolka

4

要查看当前路径,请键入echo $PATHprintenv PATH

然后,您将知道搜索的顺序。如果您有多个同名文件,只需运行哪个____即可查看。

例如

系统编号>

/ usr / bin / grep

查找像目标一样工作的文件的一种很酷的方法是使用apropos:

Apropos grep

bzgrep(1)-可能在bzip2压缩文件中搜索正则表达式

egrep(1)-打印与模式匹配的行

fgrep(1)-打印与模式匹配的行

grep(1)-打印与模式匹配的行

等等...


2
噢,是的-我忘记了whereis函数来查找文件的所有实例:> whereis grep
mbb 2011年

grep:/ bin / grep / usr / bin / grep /usr/share/man/man1/grep.1.gz
mbb

whereis使用位置的硬编码列表,而不是$PATH
grawity 2011年

@grawity您可以扩展一下吗?
WinEunuuchs2Unix

-2

@ coneslayer-查找可执行文件的默认顺序是当前路径,内置命令和$ PATH。因此,如果pwd中已经存在名为可执行文件的函数,则将执行该函数。如果不存在,则优先级先搜索shell的内置命令,然后搜索$ PATH


如果您谈论的是汤普森(Thompson)壳,马什(Mashey)壳或40年前的其他一些化石遗留物,那么您可能是对的。但是没有最新的主流Unix Shell自动搜索当前目录。
斯科特,

@Scott因此,首先内置命令的默认搜索路径,然后是$ PATH,并且仅当我输入./?时才搜索CWD。我对吗?
proc

好吧,别名,函数和内建函数。然后,如果您使用命令(包括./)指定路径,它将仅搜索该目录;否则,将仅搜索该目录。否则,它将搜索$PATH
斯科特(Scott)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.