Answers:
linux不查看当前目录以查看该目录中是否有特定命令可用
这是真的,但它确实在所有目录中查找$PATH
,即使你当时可能在这样的目录中。
要以另一种方式的字吧,如果.
不是你的$PATH
,这不要紧,你在哪里,它总是会搜索相同的目录中看到一个特定的命令是否提供了。
.
在$PATH
其中将始终查看当前目录。
这个答案很好但是评论中的讨论表明更广泛的解释可能是有用的。
本文档描述了POSIX兼容shell应以何种顺序搜索命令。它非常通用,不是最容易理解的东西。不要分析这个高度抽象的程序,让我们看看真正的shell是如何运作的。
假设
$PATH
看起来像这样:/usr/local/bin:/usr/bin:/bin
;ls
并击中Enter;ls
别名可以将命令更改为其他内容ls
;然后Bash将从ls
下面的列表中运行第一个现有对象。这是根据您的情况量身定制的清单。
ls
功能。ls
builtin(通常ls
不是Bash内置的;但是由于Bash可以动态加载新的内置命令,你可以构建内置命令ls
)。ls
可执行文件,其完整路径名存储在哈希表中(如果在过去的某个时间ls
根据下一个点发现可执行文件并且仍然记住它,则会发生这种情况)。ls
可执行的$PATH
。在您的情况下,序列是:
/usr/local/bin/ls
/usr/bin/ls
/bin/ls
注意./ls
程序中没有; 也不考虑当前的工作目录,特别是它与中的条目不匹配$PATH
。
现在这个声明
Linux不查看当前目录以查看该目录中是否有特定命令可用
只表示./ls
上面列表中没有硬编码。如果$PATH
包含.
但它会出现在列表中
出于安全原因,当前目录不在
$PATH
变量中
我将在答案的后面解释这些原因。不过你可以添加.
到你的$PATH
你自己的。在这种情况下./ls
,列表中将显示为4.x条目。它比较到Windows这将查找ls
当前工作目录,无论它是否是在$PATH
与否。如果Linux做了同样的事情,那么总会在./ls
我们列表的第3点之上的某处硬编码。
如果你当前的工作目录/usr/bin
和清单说,ls
应该下定决心/usr/bin/ls
,那么它在技术上同样不是可执行文件./ls
,但
./ls
路径,程序产生/usr/bin/ls
;/usr/bin
意味着什么 ;/usr/bin
是$PATH
手段很多。但是,如果你有.
在你的第一个条目$PATH
,然后
./ls
路径;/usr/bin
意味着很多 ;/usr/bin
是$PATH
将意味着什么。在这两种情况下,它都是在一天结束时运行的相同的可执行文件,但shell以不同的方式访问它。
同样值得注意的是,“我当前的工作目录在我的$PATH
”或“我在我的目录中” 这样的陈述$PATH
“并不能讲述整个故事。他们可能意味着:
/some/particular/directory
在我$PATH
和我现在在/some/particular/directory
”要么
.
条目在我的身上$PATH
”。如图所示,这两种情况不同。
看起来你ls
不希望被发现只是因为你碰巧在它的目录中。嗯,这将是不方便的,而没有任何安全优势。主要的安全原因不具有.
如在一般命令搜索序列和不具有固定步骤.
中$PATH
在解释此UNIX FAQ:
考虑
.
在第一个条目的情况下会发生什么PATH
。假设您当前的目录是可公开写入的目录,例如/tmp
。如果碰巧是/tmp/ls
某个其他用户在那里命名的程序,并且您键入ls
(当然,打算运行正常/bin/ls
程序),那么shell将运行./ls
另一个用户的程序。毋庸置疑,运行这样的未知程序的结果可能会让您感到惊讶。
没有必要禁止/usr/bin/ls
只因为你在/usr/bin
。如果ls
存在恶意,您可能已经在另一个目录中运行它,或者您将在另一个目录中工作时最终运行它。
总结一下,ls
在你的例子中有效,因为它/usr/bin/ls
是找到的,而不是./ls
。后一条路径解析为前一条路径的事实并不重要,因为后者的路径并未首先使用。它没有被使用,因为“Linux不会查看当前目录......”(意思是它没有查看.
)。它确实看起来/usr/bin
,因为它在你的$PATH
。