Answers:
对于当前目录中的文件,您需要在它们之前加上./
,因此命令将变为./executable.sh
。您不应该.
在PATH中使用它,因为它会带来安全风险以及其他问题。
目录在PATH中排在首位,并且首先搜索。
如果我没有记错的话,搜索的总体顺序如下:
别名
导出功能
内置的shell命令
PATH中的脚本和二进制文件
hash -r
如果您更改PATH或程序位置,则必须清除缓存(使用)。
尽管其他一些人已经很好地回答了这个问题,但我想补充一些想法:
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
我注销并再次登录之前,它位于左侧。
要查看当前路径,请键入echo $PATH
或printenv PATH
。
然后,您将知道搜索的顺序。如果您有多个同名文件,只需运行哪个____即可查看。
例如
系统编号>
/ usr / bin / grep
查找像目标一样工作的文件的一种很酷的方法是使用apropos:
Apropos grep
bzgrep(1)-可能在bzip2压缩文件中搜索正则表达式
egrep(1)-打印与模式匹配的行
fgrep(1)-打印与模式匹配的行
grep(1)-打印与模式匹配的行
等等...
whereis
使用位置的硬编码列表,而不是$PATH
。
@ coneslayer-查找可执行文件的默认顺序是当前路径,内置命令和$ PATH。因此,如果pwd中已经存在名为可执行文件的函数,则将执行该函数。如果不存在,则优先级先搜索shell的内置命令,然后搜索$ PATH
./
)指定路径,它将仅搜索该目录;否则,将仅搜索该目录。否则,它将搜索$PATH
。
which <executable>
命令将在此线程中有用。