运行以下命令(其中a.out
是有效的C可执行文件):
. a.out
...导致出现以下错误:
bash: .: a.out: 无法执行二进制文件
然而,运行以下命令:
./a.out
...成功执行了C语言二进制可执行文件。
显然,这里发生了两种类型的执行,它们有何不同之处?
运行以下命令(其中a.out
是有效的C可执行文件):
. a.out
...导致出现以下错误:
bash: .: a.out: 无法执行二进制文件
然而,运行以下命令:
./a.out
...成功执行了C语言二进制可执行文件。
显然,这里发生了两种类型的执行,它们有何不同之处?
Shell使用空格来分隔要运行的命令和其参数。
在第一个示例中,要运行的命令是.
,其参数为a.out
。 .
命令是shell的快捷方式,用于将包含shell命令的文件名作为其第一个参数并在当前shell中运行这些命令的source
命令。 该命令失败,因为a.out
是一个二进制文件,而不是shell脚本。
在第二个示例中,要运行的命令是./a.out
,这意味着运行当前目录中存储的文件a.out
。
source
是一个对 .
的非可移植简写,而不是反过来。 - gronostajsource
已经被标准化了,但我刚刚查了一下 POSIX,只有 .
在里面。 - Barmar./program
运行位于当前工作目录(./
)的名为 program
的文件 (在新的 shell 中运行 shell 脚本)。.
等同于source
,它可以在当前 shell中运行 shell 脚本。与 ./program
不同,它不能用于运行二进制文件!例如,您可以使用此命令运行您的 .bashrc
shell 脚本,因为您希望此脚本修改您的当前 shell。 .
(点)命令,其参数为 a.out
。 点命令的作用是将文本文件解析为在当前shell环境中执行的命令。 它会报错,因为 a.out
不是文本文件。 ./a.out
,这意味着“当前目录中名为 a.out
的程序”。.
单独使用,表示source
命令。它会按行读取文件内容,并在当前shell中执行 - 但是,如您所见,这对于二进制可执行文件(而非脚本)无效。
在路径上下文中,例如./
,.
表示当前目录。因此,./a.out
表示“在当前目录中运行名为a.out的文件”。
. myfile
:从 myfile
中执行命令。(类似于 C Shell 中的 source
命令)./myfile
:执行 myfile
。
进一步说,.
本身就是一个命令(并将myfile
作为参数传递),而./
是文件的(相对)路径。当执行./myfile
时,你执行的是当前目录中的可执行文件 myfile
。a.out
这样的可执行文件(我假设它是 C 或者 C++ 可执行文件或类似的程序)时,你需要输入./a.out
。. myfile
。其中最深刻的例子可能是当你更改了.bashrc
或.profile
文件的内容后,你想要"应用"这些更改到系统中。.
命令与.
混淆,后者是你的当前目录(如ls -a
的第一个结果)。. a.out
这段代码将在当前终端使用bash执行a.out中存在的shell脚本。
./a.out
cd ./documents
a.out
在子目录b
中,您可以使用b / a.out
运行它——突然之间没有点,但它与./a.out
是相同的命令)。 - David Ferenczy Rogožan