Why do you need ./ (dot-slash) before executable or script name to run it in bash?
在bash中运行脚本时,我必须在开头写
1 | $ ./manage.py syncdb |
如果我不这样做,我收到一条错误消息:
1 2 | $ manage.py syncdb -bash: manage.py: command not found |
这是什么原因? 我认为
我也不明白为什么我在运行应用程序时不需要
1 2 | user:/home/user$ cd /usr/bin user:/usr/bin$ git |
(没有
因为在Unix上,通常当前目录不在
键入命令时,shell会查找由
不在该列表上具有当前目录的原因是安全性。
假设你是root并进入另一个用户的目录并输入
它适用于
编辑
那个
当bash解释命令行时,它会在环境变量
1 | echo $PATH |
您将有一些以冒号分隔的路径。正如您将看到的当前路径
1 | PATH=$PATH:. |
此行添加
1 | manage.py syncdb |
不推荐它,因为它有安全问题,而且你可能有奇怪的行为,因为
避免:
1 | PATH=.:$PATH |
因为你可以"掩盖"一些标准命令并打开安全漏洞的大门:)
只是我的两分钱。
当shell查看
当你包含'。'时你基本上给了可执行bash脚本的"完整路径",所以你的shell不需要检查你的PATH变量。没有'。'你的shell将查看你的PATH变量(你可以通过运行
在* nix上,与Windows不同,当前目录通常不在
这个问题已经有了一些很棒的答案,但我想补充一点,如果你的可执行文件在PATH上,那么当你运行时输出会有很大的不同
1 | ./executable |
如果你跑,你得到的
1 | executable |
(假设您遇到的错误消息是一个而不是另一个),那么问题可能是您的计算机上有两个不同版本的可执行文件:一个在路径上,另一个不在。
通过运行检查
可执行文件
和
1 | whereis executable |
它修复了我的问题...我有三个版本的可执行文件,其中只有一个是为环境正确编译的。
当脚本不在Path中时,它需要这样做。欲了解更多信息,请阅读http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html
所有人都对这个问题有很好的答案,是的,这只适用于在当前目录上运行它,除非你包含绝对路径。请参阅下面的示例。
此外,当我在子文件夹tmp2(/ tmp / tmp2)上执行命令并使用(双点斜杠)时,(点斜线)对我有意义。
样品:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [fifiip-172-31-17-12 tmp]$ ./StackO.sh Hello Stack Overflow [fifi@ip-172-31-17-12 tmp]$ /tmp/StackO.sh Hello Stack Overflow [fifi@ip-172-31-17-12 tmp]$ mkdir tmp2 [fifi@ip-172-31-17-12 tmp]$ cd tmp2/ [fifi@ip-172-31-17-12 tmp2]$ ../StackO.sh Hello Stack Overflow |
当前目录:它是执行shell或父进程的目录。
1 | you are right"." is for current directory. |
在基于UNIX的系统中,如果您的文件位于