在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/40156280/