如何解释终端中可执行文件名称前的'./'前缀?

Mor*_*lde 4 c unix terminal

每次我编译一个C程序,比如使用cc编译器,我在当前目录中得到一个可执行文件.现在,如果我想运行它,而不是只键入a.outname_of_executable,我必须用这个组合作为前缀./a.out.

我理解背后的含义.(链接到当前目录)和..(链接到其父目录),也是/目录名之间的分隔符.

但是这是什么意思./?它只是一种正式的方式来区分引用某个东西的名称,以及运行该东西的意图(因为你/的文件名中没有)?

Kei*_*son 14

当您键入可执行程序的名称时,shell会在名称存储在$PATH环境变量中的目录序列中搜索它.

当前目录.通常不是(也不应该)在您的目录中$PATH.因此,如果您输入just a.out,shell将无法找到它 - 除非恰好有a /usr/bin/a.out,或/usr/local/bin/a.out,或....

为什么不.应该在你的$PATH?(有时,在某些系统上,它是.)因为它创建了一个安全漏洞.如果.位于您的前面$PATH,那么如果您cd到的目录恰好包含一个被调用的命令ls,则很容易意外地执行它,并且会产生任意不良后果.即使.是在最后$PATH,如果您刚编译的小程序或刚刚编写的脚本恰好与标准命令具有相同的名称,您仍然会遇到问题.我看到很多人变得非常困惑,因为命名为测试程序test,但打字test运行/bin/test.

命令可以是内置命令(由外壳提供的)或可执行文件的名称.如果键入ls,shell会ls在您的某个目录中找到一个可执行文件$PATH.如果键入a.out,则在名称中的任何目录中都没有该名称的可执行文件$PATH- 因此出现错误消息.

键入可执行文件的路径(甚至是相对路径./a.out)会导致shell绕过$PATH搜索; 你告诉shell确切地找到可执行文件的位置,而不是要求shell搜索它.

  • 可执行文件是一个命令.并非所有文件都是命令.(同样,并非所有命令都是*文件*; shell通常有几个内置命令). (3认同)
  • **命令**可以是内置命令(由shell提供)或可执行文件的名称.如果输入`ls`,shell会在`$ PATH`中指定的一个目录中找到一个名为`ls`的可执行文件.如果键入`a.out`,则在$ $ PATH`中指定的任何目录中都没有该名称的可执行文件 - 因此出现错误消息. (2认同)
  • +1:*"我看到很多人变得非常困惑,因为命名为测试程序测试,但键入测试运行/ bin/test"*.我想这是去年在我大学最常见的错误之一:`valgrind test!= valgrind./ test` (2认同)