【问题标题】:How to explain './' prefix before the name of an executable in terminal? [closed]如何在终端中的可执行文件名称前解释“./”前缀? [关闭]
【发布时间】:2013-11-30 04:40:41
【问题描述】:

每次我编译一个 C 程序时,比如使用 cc 编译器,我都会在当前目录中获得一个可执行文件。现在,如果我想运行它,而不是只输入 a.outname_of_executable,我必须在前面加上 ./a.out 这个组合。

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

但是./ 是什么意思呢?它只是一种正式的方式来区分引用某事物的名称和运行该事物的意图(因为您的文件名中不能包含/)?

【问题讨论】:

  • 我认为当您键入程序名称时,它会使用PATH 来确定在哪里可以找到该程序,除非您已明确说明要查找的目录。 ./ 做到了。 (如果您拥有系统管理员权限,这样做真的很重要,否则谁知道您可以执行什么程序。)

标签: c unix terminal


【解决方案1】:

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

当前目录. 通常不在您的$PATH 中(也不应该)。所以如果你只输入a.out,shell 就找不到它——除非碰巧有/usr/bin/a.out,或/usr/local/bin/a.out,或..

为什么. 不能出现在您的$PATH 中? (有时,在某些系统上确实如此。)因为它会造成安全漏洞。如果. 在你的$PATH 前面,那么如果你cd 到一个目录恰好包含一个名为ls 的命令,那么很容易意外执行它,造成任意不良后果。即使.$PATH 的末尾,如果您刚刚编译的小程序或您刚刚编写的脚本恰好与标准命令具有相同的名称,您仍然会遇到问题。我看到很多人变得非常困惑,因为命名为测试程序test,但输入test 运行/bin/test

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

在可执行文件中键入路径(即使是像./a.out 这样的相对路径)会导致shell 绕过$PATH 搜索;你是在告诉 shell 在哪里可以找到可执行文件,而不是让 shell 去搜索它。

【讨论】:

  • 当您输入$ a.out 时,您如何解释警告-bash: a.out: command not found?它使用了命令这个词,而不是文件,或者这只是语义?
  • A command 可以是内置命令(由 shell 提供)或可执行文件的名称。如果您键入ls,shell 会在您的$PATH 命名的目录之一中找到一个名为ls 的可执行文件。如果您键入a.out,则在$PATH 命名的任何目录中都没有该名称的可执行文件——因此出现错误消息。
  • 可执行文件是命令。并非所有文件都是命令。 (同样,并非所有命令都是文件;shell 通常有几个内置命令)。
  • +1 为什么. 不应该在$PATH
  • +1:“我看到很多人因为命名为 test 的测试程序而变得非常困惑,但是输入 test 运行 /bin/test”。我想这是我大学去年最常犯的错误之一:valgrind test != valgrind ./test
【解决方案2】:

出于安全原因,大多数 UNIX 不允许从当前目录运行程序,只能从您的 PATH 变量运行。想象一下,如果您解压缩包含 lsgcc 之类的命令的文件并且安装了特洛伊木马?你可以很容易地意外运行它。

因此,您必须使用./ 指定您要从当前目录运行命令。

【讨论】:

    【解决方案3】:

    当您输入可执行文件的名称时,UNIX 会将该名称附加到 PATH variable 的元素中以获取可执行文件的路径。默认情况下搜索当前目录。当您在名称前加上 ./ 前缀时,您指示 shell 在当前目录中查找由点 . 表示的可执行文件

    请注意,您可以将当前目录添加到 PATH 以避免输入 ./ 前缀 but this is not recommended

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 2019-02-26
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多