我的困惑
a.out
是我在 Ubuntu 12.10 中执行的程序的输出。在Red Hat系统中,当我a.out
在终端中执行时,它会执行。在 Ubuntu 中,我必须执行./a.out
才能获得输出。 “a.out”不起作用。
有人可以解释一下命令之间有什么区别吗?
答案1
您遇到的行为很可能取决于环境变量的差异$PATH
。本质上是一个以冒号分隔的目录列表,当使用操作系统$PATH
调用调用程序时,将按顺序搜索特定的可执行文件。exec
可以$PATH
包含相对路径组件,通常.
或空字符串,它们都引用当前工作目录。如果当前目录是 的一部分$PATH
,则可以仅通过其名称来执行当前工作目录中的文件,例如a.out
。如果当前目录不在 中$PATH
,则必须指定可执行文件的相对或绝对路径,例如./a.out
。
包含相对路径组件$PATH
具有潜在的安全隐患,因为前面目录中的可执行文件$PATH
会掩盖列表后面目录中的可执行文件。例如,考虑对当前工作目录路径.
以.例如,如果攻击者设法将与常用系统实用程序共享名称的恶意脚本放置在当前目录中(这通常比替换 root 拥有的二进制文件要容易得多),则用户将在以下情况下无意中调用恶意脚本:目的是调用系统。即使仅附加在 的末尾,用户也可能会被欺骗而无意中调用当前目录中的可执行文件,该可执行文件与在该特定系统上找不到的通用实用程序共享名称。这就是为什么它很常见/bin
$PATH
ls
/bin
ls
.
$PATH
不是将相对路径组件作为默认的一部分$PATH
。