执行程序时为什么要用“./”?

执行程序时为什么要用“./”?

如果我有一个名为 foo 的程序,为什么我需要说 ./foo 而不仅仅是 foo? ./ 不是只意味着在当前目录中吗?

答案1

当您仅输入命令时 – 例如。foo– 外壳(通常bash)只会在某些目录中查找它 – 例如 /bin、/usr/bin、/usr/X11R6/bin 等。它通常会不是出于安全考虑,请查看您的“当前目录”(即“。”)(尤其如果你是)。如果 ”。”已添加,应添加到结尾搜索路径。

如果你想运行一个可执行文件不是在此搜索路径中,您需要指定命令的完整绝对或相对路径。例如:

/home/bok/foo   # Absolute in my homedir

~/src/bar  # Shorthand for my homedir and a subdir in it

../Download/foobar  # Relative path – up one step, then down in Download

或者 - 如果命令位于我的当前目录中 - 只需添加./

./foo

的搜索路径为bash存储在小路环境变量,因此您可以通过键入以下内容来查看它:

echo $PATH

加上 ”。” – 你真的不应该做 – 输入:

export PATH="$PATH:."

PATH 是按顺序搜索的,因此如果不同目录中有多个同名的可执行文件,shell 将执行 PATH 中第一个目录中的可执行文件。

首先查看所有列出的目录后,您是否会收到“找不到命令”错误。

+++

将当前目录添加到 PATH 的问题.是,您并不真正知道您可能恰好位于的“非标准”目录中的可执行文件是否应该执行。

假设我很邪恶,制作了一个破坏性程序,删除尽可能多的文件并将其保留在我的主目录中 - 或者更糟糕的是,在 /tmp 中......我称这个程序为sl- 常见的失误类型ls- 然后等待。

一些随机用户位于 /tmp 中,并且拼写ls错误sl。使用正常的 PATH – 没有 . – 什么也没发生,除了他收到“找不到命令”的错误。如果他得到‘.’在 PATH 的末尾,那么他在输入命令时就不会出现错误。相反,我的sl命令将运行,并删除他拥有的所有文件。如果他碰巧是,该命令将能够删除系统的大部分内容。 (这就是为什么 真的应该制定规则总是使用完整路径命令,而不是信任 PATH。)

如果他放了“.”首先在他的路径中,我制作了名为(正确拼写)的程序ls并将其放入一个目录中,那么它将是我的程序——不是正常的——如果他在该目录中ls输入,就会运行该程序。ls因为bash会在当前目录(.)中查找第一的– 在查看带有正版的系统目录之前ls

相关内容