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

$ ./manage.py syncdb


如果不这样做,则会收到错误消息:

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


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

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

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


(无需./运行)

最佳答案

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

当您键入命令时,shell将根据PATH变量指定目录列表。当前目录不在该列表中。

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

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

它与./一起使用,因为POSIX specifies会将包含/的命令名直接用作文件名,从而禁止在$PATH中进行搜索。您可以使用完整路径来获得完全相同的效果,但是./较短且更易于编写。

编辑

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

关于bash - 为什么在可执行文件或脚本名称之前需要./(点斜杠)才能在bash中运行它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40156280/

10-12 00:43