小编典典

为什么在可执行文件或脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?

all

在 bash 中运行脚本时,我必须./在开头写:

$ ./manage.py syncdb

如果我不这样做,我会收到一条错误消息:

$ manage.py syncdb
-bash: manage.py: command not found

这是什么原因?我认为.是当前文件夹的别名,因此这两个调用应该是等效的。

我也不明白为什么我./在运行应用程序时不需要,例如:

user:/home/user$ cd /usr/bin
user:/usr/bin$ git

(没有运行./


阅读 132

收藏
2022-04-11

共1个答案

小编典典

因为在 Unix 上,通常当前目录不在$PATH.

当您键入命令时,shell 会查找由PATH变量指定的目录列表。当前目录不在该列表中。

该列表中没有当前目录的原因是安全性。

假设您是 root 并进入另一个用户的目录并键入sl而不是ls. 如果当前目录在 中PATH,shell
将尝试执行该sl目录中的程序(因为没有其他sl程序)。该sl程序可能是恶意的。

它之所以有效,./是因为POSIX
指定
包含
a 的命令名将/直接用作文件名,从而禁止在$PATH. 您可以使用完整路径来获得完全相同的效果,但./更短且更容易编写。

编辑

sl部分只是一个例子。PATH顺序搜索其中的目录,并在匹配时执行该程序。因此,根据PATH外观,键入普通命令可能足以或可能不足以在当前目录中运行程序。

2022-04-11