AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1260013
Accepted
Ritesh Singh
Ritesh Singh
Asked: 2020-07-18 19:26:01 +0800 CST2020-07-18 19:26:01 +0800 CST 2020-07-18 19:26:01 +0800 CST

为什么 ./a.out 有效,但 a.out 无效?[复制]

  • 772
这个问题在这里已经有了答案:
为什么在当前目录中执行程序之前需要输入`./`? (11 个回答)
为什么在 Unix 中使用“./”来运行“.sh”脚本?[重复] (2个答案)
2年前关闭。

在我看来,即使是a.out终端上的一个简单的文件也包含有关当前目录中文件的完整信息。重申它./a.out似乎是多余的。

为什么我们需要指定文件在当前目录中才能执行呢?

command-line gnome-terminal executable execute-command
  • 3 3 个回答
  • 711 Views

3 个回答

  • Voted
  1. guiverc
    2020-07-18T19:31:12+08:002020-07-18T19:31:12+08:00

    这取决于您的 $PWD 是什么。

    ./a.out告诉系统在当前目录中查找 a.out,因为您已经提供了文件的路径a.out

    a.out仅当 $PWD(您当前的工作目录)恰好位于 $PATH 或搜索二进制文件的目录中时才有效。

    只有在搜索字段中列出您的当前目录时才会搜索它,从而减少错误并通过避免错误潜在地提高安全性。

    • 4
  2. Best Answer
    Sergiy Kolodyazhnyy
    2020-07-18T19:43:54+08:002020-07-18T19:43:54+08:00

    为什么我们需要指定文件在当前目录中才能执行呢?

    Shell 行为由 POSIX 标准化,并且出于安全原因无法识别当前工作目录中的可执行文件。单独并 a.out不能讲述完整的故事。

    具体来说,这被定义为 Shell 命令语言的 POSIX 标准中的标准行为,在所有特定于 shell 的扩展和重定向以及内置查找完成后的命令搜索和执行部分:

    否则,应使用 PATH 环境变量搜索命令,如 IEEE Std 1003.1-2001 的基本定义卷第 8 章环境变量中所述:

    至于a.outshell,只是一串文本。根据文本字符串的排列方式,shell 需要去除重定向、变量替换和扩展;之后剩下的就是一个“命令”,它可能是也可能不是内置的。a.out不是内置在任何常见的外壳中,所以这就是./发挥作用的地方。

    当然,你可以添加.到PATH变量中,它会起作用——你就可以调用了a.out。但这是一种非常糟糕的做法和安全风险:请参阅添加 . 到我的路径?怎么来的?.

    换句话说,不,它不是多余的。这就是 shell 应该如何工作的,并且由于技术原因而存在。


    旁注1: 根据手册bash(1)bash也接受零长度字段:PATH

    PATH 值中的零长度(空)目录名称表示当前目录。空目录名称可能显示为两个相邻的冒号,或者作为初始或尾随冒号。

    旁注2:使用的另一个好处./ 是避免与与本地可执行文件共享相同名称的系统实用程序混淆。尽管在这个特定问题中,它专门讨论了a.out可执行文件名称(在编译 C 代码时自动分配),但如果编译代码并将输出命名为可执行文件test(即gcc -o test test.c生成可执行文件并且您在 shell 中test调用testnot as command)会发生什么情况./test?

    shell 会/usr/bin/test根据变量/usr/bin中的列表找到PATH并执行该特定的二进制文件,而不是test当前工作目录中命名的可执行文件。事实上,我之前已经回答过一个关于这种情况的问题:运行 shell 脚本时,'test' 和 'test.sh' 有什么区别?

    • 4
  3. mook765
    2020-07-18T19:53:22+08:002020-07-18T19:53:22+08:00

    来自man bash:

    COMMAND EXECUTION
           After a command has been split into words, if it results in a simple command
           and an optional list of arguments, the following actions are taken.
    
           If the command name contains no slashes, the shell attempts to locate it.
           If there exists a shell function by that name, that function is invoked as
           described above in FUNCTIONS. If the name does not match a function, the
           shell searches for it in the list of shell builtins. If a match is found,
           that builtin is invoked.
    
           If the name is neither a shell function nor a builtin, and  contains no
           slashes, bash searches each element of the PATH for a directory containing
           an executable file by that name.
    

    换句话说,如果你在没有前导的情况下调用可执行文件./,shell 将在 PATH 中搜索命令并且找不到该命令,因为当前目录不在你的 PATH 中。如果将当前目录添加到 PATH,则可以调用不带前导./.

    • 3

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve