在运行编译的代码时使用 ./

在运行编译的代码时使用 ./

我们为什么使用./在linux中运行编译后的代码之前?如果我位于比编译代码更高的目录中,则似乎没有必要。让我通过例子来解释一下。如果我的代码在/home/uname/代码,而且我也在同一个目录中,我必须使用./a.输出。但如果我在/home/uname/那么我可以使用./代码/a.out。我在这里使用./但我认为更多的是浏览目录,而不是表明它必须运行代码。那么为什么我需要使用./如果我与代码位于同一目录中,则运行已编译的代码?

答案1

当您发出命令时,您的 shell 会使用一个技巧,使您看起来可以只调用该命令而不指定其完整路径。 shell 在环境变量中列出的每个目录中查找该命令$PATH,如果找到,则安排运行该命令。

如果要运行不在 中的目录之一中的命令$PATH,则必须向 shell 提供在何处查找该文件的提示。在您的示例中,由于/home/uname/codeis not in $PATH,您需要为 shell 提供足够的路径信息,以便能够找到您想要执行的文件。无论您当前的工作目录恰好是文件所在的目录还是任何其他目录,都是如此。如果您碰巧与要执行的文件位于同一目录中,则./文件名之前的内容足以告诉 shell 在哪里可以找到该文件。

答案2

shell 的输入始终是可执行文件的路径;无论是绝对的还是相对的。它必须由目录路径/文件名组成。如果您仅在当前目录中指定可执行文件名,shell 将自动为您输入的字符串添加前缀$PATH。这就是为什么你总是需要输入一条路径。

顺便说一句,如果您的代码位于/home/uname/code/并且您位于/home/uname/,则不一定需要使用

./代码/a.out
你也可以只使用
代码/a.out
因为它也是相对路径。

答案3

如果which找不到您的可执行文件,那么您的 shell 也找不到。

which ./a.out有效,就像一样which ./code/a.out- 它们打印出可执行文件的完整路径 - 但不是which a.out

正如其他人指出的那样,如果您PATH在调用相关程序之前更改环境变量,那么它会起作用。

例如在bash

[uname@host:/home/uname/code]$ echo $PATH
/usr/bin:/bin
[uname@host:/home/uname/code]$ which a.out
which: no a.out in (/usr/bin:/bin)

[uname@host:/home/uname/code]$ which ./a.out
/home/uname/code/a.out

# add present directory to path
[uname@host:/home/uname/code]$ export PATH="${PWD}:${PATH}"

[uname@host:/home/uname/code]$ echo $PATH
/home/uname/code:/usr/bin:/bin

[uname@host:/home/uname/code]$ which a.out
/home/uname/code/a.out

相关内容