首页 文章

为什么在可执行文件或脚本名称之前需要./(dot-slash)才能在bash中运行它?

提问于
浏览
236

在bash中运行脚本时,我必须在开头编写 ./

$ ./manage.py syncdb

如果我不这样做,我收到一条错误消息:

$ manage.py syncdb
-bash: manage.py: command not found

这是什么原因?我认为 . 是当前文件夹的别名,因此这两个调用应该是等效的 .

运行应用程序时,我也不需要 ./ ,例如:

user:/home/user$ cd /usr/bin
user:/usr/bin$ git

(没有 ./ 运行)

9 回答

  • 4

    当你包含'.'时,你实际上是将"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

  • 249

    当bash解释命令行时,它会在环境变量 $PATH 中描述的位置查找命令 . 看它的类型:

    echo $PATH
    

    您将有一些以冒号分隔的路径 . 正如您将看到的当前路径 . 通常不在 $PATH 中 . 因此,如果Bash位于当前目录中,则无法找到您的命令 . 您可以通过以下方式进行更改:

    PATH=$PATH:.
    

    此行添加 $PATH 中的当前目录,以便您可以执行以下操作:

    manage.py syncdb
    

    它是 not 推荐,因为它有安全问题,而且你可以有奇怪的行为,因为 . 因你所在的目录而异:)

    避免:

    PATH=.:$PATH
    

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

    只是我的两分钱 .

  • -5

    所有人都对这个问题有很好的答案,是的,这只适用于在当前目录上运行它,除非你包含绝对路径 . 请参阅下面的示例 .

    此外,当我在子文件夹tmp2(/ tmp / tmp2)上执行命令并使用(双点斜杠)时,(dot-slash)对我有意义 .

    样品:

    [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
    
  • 32

    Current DirectoryWorking Directory 之间存在差异,您可能很容易在 google 找到它 . 这就是你 manage.py syncdb 没有按预期执行的原因 .

    Current Directory :它是执行shell或父进程的目录 .

    you are right "."  is for current directory.
    

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

  • 1

    因为在Unix上,通常,当前目录不在 $PATH 中 .

    键入命令时,shell会查找 PATH 变量指定的目录列表 . 当前目录不在该列表中 .

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

    让's say you'重新登录并进入另一个用户的目录并输入 sl 而不是 ls . 如果当前目录在 PATH 中,shell将尝试在该目录中执行 sl 程序(因为没有其他 sl 程序) . 那 sl 程序可能是恶意的 .

    它适用于 ./ ,因为POSIX specifies包含 / 的命令名将直接用作文件名,从而抑制 $PATH 中的搜索 . 您可以使用完整路径获得完全相同的效果,但 ./ 更短且更容易编写 .

    EDIT

    那个 sl 部分只是一个例子 . 按顺序搜索 PATH 中的目录,并且匹配时执行该程序 . 因此,根据 PATH 的外观,键入正常命令可能会或可能不足以在当前目录中运行该程序 .

  • -1

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

    ./executable
    

    如果你跑,你得到的

    executable
    

    (假设您遇到的错误消息是一个而不是另一个),那么问题可能是您的计算机上有两个不同版本的可执行文件:一个在路径上,另一个不在 .

    通过运行检查

    可执行文件

    whereis executable
    

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

  • 44

    当shell查看 $PATH 环境变量以查找脚本时,将无法找到您的主目录中的脚本 .

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

  • 0

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

  • 1

    在* nix上,与Windows不同,当前目录通常不在 $PATH 变量中 . 因此,执行命令时不会搜索当前目录 . 您不需要 ./ 来运行应用程序,因为这些应用程序位于$ PATH中;最有可能的是 /bin/usr/bin .

相关问题