为什么你需要./(点斜线)之前的脚本名称运行在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会按照PATH
variables的指定查找一个目录列表。 当前目录不在该列表中。
没有当前目录在该列表上的原因是安全。
假设你是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不同,当前目录通常不在$PATH
variables中。 所以执行命令时不会search当前目录。 您不需要运行应用程序./
因为这些应用程序在您的$ PATH; 很可能它们在/bin
或/usr/bin
。
这个问题已经有了一些很棒的答案,但是我想补充一点,如果你的可执行文件在PATH上,并且在运行时会得到非常不同的输出
./executable
如果你跑步的话,你会得到的
executable
(假设你遇到了错误信息而不是其他信息),那么问题可能是你的机器上有两个不同版本的可执行文件:一个在path上,另一个不在。
通过运行检查这个
可执行文件
和
whereis executable
它解决了我的问题…我有三个版本的可执行文件,只有其中一个编译正确的环境。
Current Directory
和Working 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
。 希望你有我想解释的。