为什么你需要./(点斜线)之前的脚本名称运行在bash?

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

当你input一个命令时,shell会按照PATHvariables的指定查找一个目录列表。 当前目录不在该列表中。

没有当前目录在该列表上的原因是安全。

假设你是root用户,进入另一个用户的目录,inputsl而不是ls 。 如果当前目录是PATH ,那么shell将尝试执行该目录下的sl程序(因为没有其他的sl程序)。 这个sl程序可能是恶意的。

它适用于./因为POSIX指定一个包含/的命令名将直接用作文件名,从而抑制$PATH的search。 您可以使用完全相同的效果,但./更短,更容易编写。

编辑

sl部分只是一个例子。 PATH中的目录是按顺序search的,当匹配时执行程序。 所以,根据PATH外观,input一个正常的命令可能会或可能不足以运行当前目录中的程序。

当bash解释命令行时,它会在环境variables$PATH描述的位置查找命令。 看到它types:

 echo $PATH 

你将有一些冒号由冒号分隔。 你会看到当前的path. 通常不在$PATH 。 所以Bash找不到你的命令,如果它在当前目录下。 您可以通过以下方式更改它:

 PATH=$PATH:. 

这一行添加$PATH的当前目录,所以你可以这样做:

 manage.py syncdb 

build议这样做,因为它有安全问题,再加上你可能会有奇怪的行为. 根据您所在的目录而有所不同:)

避免:

 PATH=.:$PATH 

正如你可以“掩盖”一些标准命令并打开安全漏洞的大门:)

只是我的两分钱。

当shell查看$PATH环境variables以查找脚本时,将不会在您的主目录中find您的脚本。

./表示'查看当前目录中的脚本,而不是查看$PATH指定的所有目录。

当你包括'。' 你本质上是给可执行的bash脚本的“完整path”,所以你的shell不需要检查你的PATHvariables。 没有'。' 你的shell会查看你的PATHvariables(你可以通过运行echo $PATH来查看你input的命令是否存在于PATH的任何文件夹中,如果没有的话(与manage.py一样)它表示无法find该文件,在PATH中包含当前目录被认为是不好的做法,这里有相当好的解释: http : //www.faqs.org/faqs/unix-faq/faq/part2 /section-13.html

当脚本不在path中时,它需要这样做。 欲了解更多信息,请阅读http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html

在* nix上,与Windows不同,当前目录通常不在$PATHvariables中。 所以执行命令时不会search当前目录。 您不需要运行应用程序./因为这些应用程序在您的$ PATH; 很可能它们在/bin/usr/bin

这个问题已经有了一些很棒的答案,但是我想补充一点,如果你的可执行文件在PATH上,并且在运行时会得到非常不同的输出

 ./executable 

如果你跑步的话,你会得到的

 executable 

(假设你遇到了错误信息而不是其他信息),那么问题可能是你的机器上有两个不同版本的可执行文件:一个在path上,另一个不在。

通过运行检查这个

可执行文件

 whereis executable 

它解决了我的问题…我有三个版本的可执行文件,只有其中一个编译正确的环境。

Current DirectoryWorking Directory之间有区别,你可能很容易在google上find它。 这就是您的manage.py syncdb按预期执行的原因。

当前目录 :这是执行shell或父进程的目录。

 you are right "." is for current directory. 

在基于UNIX的系统中,如果您的文件位于/data/myfile.out那么您将通过以forward slash "/"分隔的组件名称遍历文件,如果"." 是你当前的目录,那么如果你想访问(在你的情况下执行)在你的当前目录中的文件,你将不得不说./myexecutableFile.o 。 如果你的可执行文件在当前目录的另一个文件夹中,那么你可以这样做./myFiles/myexecutableFile.o 。 希望你有我想解释的。