在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
中,shell 将尝试在该目录中执行 sl
程序(因为没有其他 sl
程序) .那个 sl
程序可能是恶意的。
它适用于 ./
因为 POSIX specifies包含 /
的命令名称将直接用作文件名,从而禁止在 $PATH
中进行搜索。您可以使用完整路径来获得完全相同的效果,但 ./
更短且更易于编写。
编辑
那个 sl
部分只是一个例子。 PATH
中的目录按顺序搜索,当匹配到该程序时执行该程序。因此,根据 PATH
的外观,键入普通命令可能足以或可能不足以在当前目录中运行程序。
关于bash - 为什么在可执行文件或脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48550974/