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