Answers:
linux不查看当前目录以查看该目录中是否有特定命令可用
这是真的,但它确实在所有目录中查找$PATH,即使你当时可能在这样的目录中。
要以另一种方式的字吧,如果.不是你的$PATH,这不要紧,你在哪里,它总是会搜索相同的目录中看到一个特定的命令是否提供了。
.在$PATH其中将始终查看当前目录。
这个答案很好但是评论中的讨论表明更广泛的解释可能是有用的。
本文档描述了POSIX兼容shell应以何种顺序搜索命令。它非常通用,不是最容易理解的东西。不要分析这个高度抽象的程序,让我们看看真正的shell是如何运作的。
假设
$PATH看起来像这样:/usr/local/bin:/usr/bin:/bin;ls并击中Enter;ls 别名可以将命令更改为其他内容ls;然后Bash将从ls下面的列表中运行第一个现有对象。这是根据您的情况量身定制的清单。
ls 功能。lsbuiltin(通常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。