it-swarm.cn

为什么在Linux / UNIX中使用“ ./”(点斜杠)执行文件?

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

为什么不像其他命令gccls等输入它一样...

89
Renjith G

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

您可以使用 typewhich 来获取在$PATH中找到的所有命令的完整路径。

80
badp

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

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

在路径中使用.作为last条目会更安全一些,但是其他攻击也可以利用它。一种简单的方法就是利用常见的拼写错误,例如slls-l。或者,找到一个碰巧未安装在该系统上的通用命令-vim,例如,因为sysadmins键入该命令的可能性高于平均水平。

103
mattdm

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

_$ ls
_

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

_$ a.out
_

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

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

_$ gcc test.c -o test
$ ./test
_
45
Simon Whitaker

您可以尝试添加:.到您的$ PATH变量。

尝试按ALT + F2并输入:gksudo gedit /etc/environment(如果运行Linux/GTK)(如果使用Ubuntu,这就是您所拥有的)。

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

您知道,自1970年以来,这种工作就一直这样。有一个原因,为什么当前目录未包含在$ PATH中。

.是当前目录

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

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

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

4
tiktak

更完整的规则实际上是:如果路径中有斜杠_/_,请不要搜索PATH

在我们深入探讨基本原理之前,您应该首先了解以下事实:运行以下任一程序:

_bin/someprog
_

要么:

_/bin/someprog
_

要么:

_cd bin
./myexec
_

执行_bin/someprog_而不出于完全相同的原因搜索PATH变量:_bin/someprog_,_/bin/someprog_和_./someprog_的所有斜线都带有_/_他们。

someprog本身没有斜杠_/_,因此仅在PATH中搜索。

POSIX 7 在以下位置指定此规则: http://pubs.opengroup.org/onlinepubs/9699919799/utilities /V3_chap02.html#tag_18_09_01_01

_/_ POSIX PATH规则的理论依据

假设正在运行:

_someprog
_

会搜索:

  • 相对于CWD优先
  • 相对于PATH之后

然后,如果您想从发行版中运行_/bin/someprog_,则可以执行以下操作:

_someprog
_

它有时可以工作,但其他方法则可能失败,因为您可能位于一个包含另一个不相关的someprog程序的目录中。

因此,您很快就会知道这是不可靠的,并且当您要使用PATH时,最终总是使用绝对路径,因此违反了PATH的目的。

这也是为什么在PATH中包含相对路径是一个非常糟糕的主意。我 看着你,_node_modules/bin_

相反,假设正在运行:

_./someprog
_

将搜索:

  • 相对于PATH首先
  • 相对于CWD

然后,如果您只是从git存储库下载了脚本someprog并想从CWD运行它,则您将无法确定这是将要运行的实际程序,因为您的发行版可能具有:

_/bin/someprog
_

去年圣诞节过后喝了太多酒后安装的某些软件包中,这是您PATH中的内容。

因此,再次,您将不得不始终使用完整路径相对于CWD运行本地脚本,以了解您正在运行的内容:

_"$(pwd)/someprog"
_

这也将非常烦人。

您可能会想出的另一条规则是:

相对路径仅使用PATH,绝对路径仅使用CWD

但这又迫使用户始终对带有"$(pwd)/someprog"的非PATH脚本使用绝对路径。

_/_路径搜索规则为about问题提供了一个易于记住的解决方案:

  • 斜线:请勿使用PATH
  • 无斜杠:仅使用PATH

依靠当前目录中的文件可以表示为_./somefile_或somefile的事实,这使得始终知道正在运行的内容变得非常容易,因此它赋予了一个特殊的含义其中。

有时,有些麻烦的是您无法搜索相对于PATH的_some/prog_,但是我看不出对此有更明智的解决方案。