在bash中运行脚本时,我必须在开头编写 ./
:
$ ./manage.py syncdb
如果我不这样做,我收到一条错误消息:
$ manage.py syncdb
-bash: manage.py: command not found
这是什么原因?我认为 .
是当前文件夹的别名,因此这两个调用应该是等效的 .
运行应用程序时,我也不需要 ./
,例如:
user:/home/user$ cd /usr/bin
user:/usr/bin$ git
(没有 ./
运行)
9 回答
当你包含'.'时,你实际上是将"full path"赋予可执行的bash脚本,所以你的shell不需要检查你的PATH变量 . 如果没有'.',你的shell将查找你的PATH变量(你可以通过运行_404828来查看你输入的命令是否存在于PATH的任何文件夹中 . 如果它没有't (as is the case with manage.py) it says it can't找到该文件 . 这被认为是不好的做法在PATH中包含当前目录,这在这里得到了相当好的解释:http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html
当bash解释命令行时,它会在环境变量
$PATH
中描述的位置查找命令 . 看它的类型:您将有一些以冒号分隔的路径 . 正如您将看到的当前路径
.
通常不在$PATH
中 . 因此,如果Bash位于当前目录中,则无法找到您的命令 . 您可以通过以下方式进行更改:此行添加
$PATH
中的当前目录,以便您可以执行以下操作:它是 not 推荐,因为它有安全问题,而且你可以有奇怪的行为,因为
.
因你所在的目录而异:)避免:
因为你可以“掩盖”一些标准命令并打开安全漏洞的大门:)
只是我的两分钱 .
所有人都对这个问题有很好的答案,是的,这只适用于在当前目录上运行它,除非你包含绝对路径 . 请参阅下面的示例 .
此外,当我在子文件夹tmp2(/ tmp / tmp2)上执行命令并使用(双点斜杠)时,(dot-slash)对我有意义 .
样品:
Current Directory
和Working Directory
之间存在差异,您可能很容易在google
找到它 . 这就是你manage.py syncdb
没有按预期执行的原因 .Current Directory :它是执行shell或父进程的目录 .
在基于UNIX的系统中,如果您的文件位于
/data/myfile.out
,那么您将通过forward slash "/"
分隔的组件名遍历您的文件,因此,如果"."
是您当前的目录,那么如果您想访问(在您的情况下执行)文件当前目录,你将不得不说./myexecutableFile.o
. 如果你的可执行文件在当前目录的另一个文件夹中,那么你会做这样的事情./myFiles/myexecutableFile.o
. 希望你得到我想要解释的内容 .因为在Unix上,通常,当前目录不在
$PATH
中 .键入命令时,shell会查找
PATH
变量指定的目录列表 . 当前目录不在该列表中 .在该列表上没有当前目录的原因是安全性 .
让's say you'重新登录并进入另一个用户的目录并输入
sl
而不是ls
. 如果当前目录在PATH
中,shell将尝试在该目录中执行sl
程序(因为没有其他sl
程序) . 那sl
程序可能是恶意的 .它适用于
./
,因为POSIX specifies包含/
的命令名将直接用作文件名,从而抑制$PATH
中的搜索 . 您可以使用完整路径获得完全相同的效果,但./
更短且更容易编写 .EDIT
那个
sl
部分只是一个例子 . 按顺序搜索PATH
中的目录,并且匹配时执行该程序 . 因此,根据PATH
的外观,键入正常命令可能会或可能不足以在当前目录中运行该程序 .这个问题已经有了一些很棒的答案,但是我想补充一点,如果你的可执行文件在PATH上,你运行时会得到非常不同的输出
如果你跑,你得到的
(假设您遇到的错误消息是一个而不是另一个),那么问题可能是您的计算机上有两个不同版本的可执行文件:一个在路径上,另一个不在 .
通过运行检查
可执行文件
和
它解决了我的问题......我有三个版本的可执行文件,其中只有一个是针对环境正确编译的 .
当shell查看
$PATH
环境变量以查找脚本时,将无法找到您的主目录中的脚本 ../
表示'查看当前目录中的脚本,而不是查看$PATH
中指定的所有目录 .当脚本不在Path中时,它需要这样做 . 欲了解更多信息,请阅读http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html
在* nix上,与Windows不同,当前目录通常不在
$PATH
变量中 . 因此,执行命令时不会搜索当前目录 . 您不需要./
来运行应用程序,因为这些应用程序位于$ PATH中;最有可能的是/bin
或/usr/bin
.