为什么我们使用“ ./”执行文件?


84

为什么我们./filename要在Linux中执行文件?

为什么不直接进入它像其他命令gccls等...


第一行难道不是写成“为什么我们./command_name要在Linux中执行命令?”

Answers:


78

在Linux,UNIX和相关的操作系统中,.表示当前目录。由于您想在当前目录中运行文件,而该目录不在您的目录中$PATH,因此需要./告诉外壳可执行文件在哪里。因此,./foo意味着运行foo此目录中名为的可执行文件。

您可以使用typewhich获取在中找到的任何命令的完整路径$PATH


5
在当前目录中执行程序是很常见的。为什么外壳也不在其中搜索?它首先在。中搜索,然后在$ PATH中搜索。
2013年

还有一些alias可能会阻碍您发展的因素,而不仅仅是$PATH
user2485710

18
@Michael安全性和理智性:如果首先搜索它,.那么它将是一个安全问题,ls例如,您或其他人可以替换(一个简单的病毒/木马:制作一个zip文件,其中包含可执行文件ls,因为有人正在搜索,他们运行此可执行文件,即…)。如果.最后搜索,那么您可能会花很长时间疯狂,不知道为什么程序无法运行(例如,您创建了一个名为test的程序,而不是运行程序,而是运行了系统测试程序。该程序不产生任何输出)。
ctrl-alt-delor 2015年

它还可以确保,如果应用程序或脚本在路径中多次出现,则表示您正在执行要运行的版本(“。”目录中的该版本)。
Jim2B

export PATH="$PATH:."如果未在PATH的其他位置找到,则可以执行当前目录中的命令,可以将其添加到.bashrc文件中
jcubic

99

字面上的答案就像其他人一样:因为当前目录不在您的目录中$PATH

但是为什么呢?简而言之,这是为了安全。如果您正在查找其他人的主目录(或/ tmp),然后键入just gccls,则想知道您正在运行的是真实目录,而不是恶作剧朋友编写的会删除您所有文件的恶意版本。另一个示例是testor [,如果您的外壳没有内置命令,它们可能会覆盖外壳脚本中的命令。

.作为最后一个在你的路径条目是比较安全,但也有其他的攻击,这使得利用这一点。一种简单的方法就是利用常见的拼写错误,例如slls-l。或者,找到一个恰巧未安装在该系统上的通用命令,vim例如,因为sysadmins键入该命令的可能性高于平均水平。


5
一个被这个问题困扰
mattdm 2011年

PATH环境变量中只包含绝对路径。
艾德·赫尔

45

如果您是说,为什么一开始就需要./-这是因为(与Windows不同,)默认情况下,当前目录不是路径的一部分。如果您运行:

$ ls

您的Shell ls在PATH环境变量的目录中查找(echo $PATH以查看它),然后运行ls它找到的第一个可执行文件。如果输入:

$ a.out

Shell也会这样做-但可能找不到名为a.out的可执行文件。您需要告诉外壳程序a.out在哪里-它在当前目录(。)中,然后路径是./a.out

如果您问为什么将其称为“ a.out”,那只是gcc的默认输出文件名。您可以使用-o命令行arg进行更改。例如:

$ gcc test.c -o test
$ ./test

谢谢。我的疑问是,为什么您一开始就需要...。我使用了“。” (进入当前目录),但是为什么之后是“ /”呢?
Renjith G

8
/是Linux中的路径分隔符,因此您可以使用它将目录(。)与文件名(a.out)分隔开。没有它,您将拥有.a.out本身就是有效的文件名。(尝试touch .a.out; ls -lA看一下。)
Simon Whitaker

5
这就是您在Unix中指定路径的方式,<dir>/<file>因此您基本上是说在当前目录中执行文件,这由./test
Rohan Monga

在i686上的Red Hat Linux版本9(Shrike)内核2.4.20-8 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA total 3 -rw-rw-r-- 1 renjithg renjithg 0 Nov 30 13 :46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 Nov 30 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 Aug 24 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G

3
红帽Linux 9?是时候升级了!
mattdm 2011年

4

您可以尝试将其添加:.到$ PATH变量中。

尝试按ALT + F2并键入:gksudo gedit /etc/environment如果运行Linux / GTK(如果使用Ubuntu,则具有此功能)。

但是,我强烈建议您不要这样做。不好不好不好

您知道,自1970年以来,这种事情就一直这样。

. 是当前目录

.something将是一个隐藏文件(键入“ ALT +”以使它们出现在Nautilus中,或尝试“ ls -la”。

./someProgram.sh 是键入要在当前目录中运行可执行文件someProgram.sh的内容。

.somethingElse 这将意味着您在当前目录中有一个隐藏的可执行文件,这是个坏主意。

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.