为什么我必须总是在可执行文件之前键入“./”才能在 Linux 中执行它?

Yas*_*ani 8 linux shell

当我通过以下方式编译 egxc 时:

GCC x.c -o x
Run Code Online (Sandbox Code Playgroud)

要执行结果我必须写:

./x
Run Code Online (Sandbox Code Playgroud)

只需输入:

x
Run Code Online (Sandbox Code Playgroud)

失败并显示此消息:

x:找不到命令

这意味着 Linux 不会在当前目录中搜索它!这种行为背后是否有(我确定有)任何合理的问题?

Oli*_*rth 13

因为默认情况下,当前工作目录不在PATH变量中。

这是一种安全/便利措施。如果您的当前工作目录中有名为 eg cdls等的二进制文件/脚本,如果它们在默认情况下运行会非常烦人。

  • @userunknown:当你第一次输入 `sl` 时,你遇到了同样的问题。只有受信任的目录应该在`$PATH` 中,而像`.` 这样的相对路径_从不_是交互式shell 的受信任目录。 (7认同)
  • 答案只是部分正确。如果当前目录仅用作最后一个选项,则可能会出现问题。然后仍然会首先找到标准工具。 (4认同)
  • 最初的 *nix 安全措施之一,它强制执行系统分配的路径命令中的系统或管理员编译的二进制文件。没有什么比有人在帮助台问题上以 root 登录,转到用户目录,输入 **ls** 并发现他们加载了用户留下的炸弹更糟糕的了。 (3认同)
  • @Basic:如果在我的意思是“rm -f target”时输入“rm -r target”,通常没有区别。如果我在输入 `rm -r target` 时输入 `rm -f target`,要么没有区别,要么删除完全失败。此外,我认为_每次_在我输入 `rm` 之前,_尤其是_如果我要添加 `-f` 或 `-r` 或一个 glob - 它本质上是一个危险的命令。在`ls`ing之前没有人会想到。 (2认同)