在Ubuntu中使用"./"运行二进制文件

4

我决定学习 C++ (我在工作中使用 C 编程),并阅读了一些教程(以及许多 Stack Overflow 上的帖子)。好的,所以我输入了标准的 C++ "hello word",在我的 Ubuntu 机器上用 GCC 编译成 "test"。

然后我尝试通过输入 "test" 并按回车键来运行它。什么也没有发生。原来我必须用 "./test" 运行它。好吧,从现在开始我会这样做。但是为什么呢?"./" 只是表示我应该运行当前目录下的内容... 当 操作系统 在搜索要运行的内容时,当前目录不总是 PATH 的一部分吗?我能不能让它变成这样呢?

7个回答

10

是的,当前目录不是您PATH的一部分。您不希望它成为PATH的一部分,因为那样您可能会运行一个恶意程序而不知道。

如果您习惯于运行/usr/bin/grep,但您所在的目录中有个坏人放了一个恶意副本的grep,这一次您运行grep时,您就会从当前目录而不是/usr/bin/grep运行grep。

您当然可以在您的~/.profile或~/.bash_profile中将./添加到您的PATH中,但我不建议这么做。

如果这让您感觉更好,15年前我开始使用类Unix系统时也有同样的挫败感。


@Andy - 可能需要补充说明,“test”是一个正常的*nix实用程序 :) - warren
@Andy,@warren - 比“常规*nix实用程序”更重要的是,它是一个shell内置命令,这意味着即使您在路径前面加上“。”,它也会使用内置命令。 - Paul Tomblin
1
值得一提的是:传统的多用户系统(VMX、UNIX、Plan9)在 PATH 中没有“.”,但单用户系统(CP/M 和 MS-DOS)有。 - Javier

6
您可以将“。”添加到您的PATH中,但这在此情况下毫无用处 - “test”是shell内置命令。

是的,我现在记起来了。我以前就曾经踩过这个陷阱。所以这不仅是双倍的,而是三倍的“WTF”(译注:即“What The F***”,表示惊讶、无语等情绪)。太棒了。 - c0m4

3
很遗憾,Unix中有一个名为“test”的命令...

1
如果您经常运行命令行脚本,您可以设置一个命令行别名来摆脱每次输入"./"的需要。

1
即使当前目录在$PATH的最前面,大多数shell也无法运行'test',因为'test'是一个内置命令。

0
没有将“.”(当前目录)添加到PATH中是一项较小的安全措施。如果您愿意,可以随时添加它,但这不是最佳实践。

0
如果不清楚的话,这是Windows与Unix/Linux不同的一个方面。在Windows上,当前目录隐式地包含在路径中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接