在 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.
$PATH
当您键入命令时,shell 会查找由PATH变量指定的目录列表。当前目录不在该列表中。
PATH
该列表中没有当前目录的原因是安全性。
假设您是 root 并进入另一个用户的目录并键入sl而不是ls. 如果当前目录在 中PATH,shell 将尝试执行该sl目录中的程序(因为没有其他sl程序)。该sl程序可能是恶意的。
sl
ls
它之所以有效,./是因为POSIX 指定包含 a 的命令名将/直接用作文件名,从而禁止在$PATH. 您可以使用完整路径来获得完全相同的效果,但./更短且更容易编写。
/
编辑
那sl部分只是一个例子。PATH顺序搜索其中的目录,并在匹配时执行该程序。因此,根据PATH外观,键入普通命令可能足以或可能不足以在当前目录中运行程序。