在bash中,“.”和“./”有什么区别?

9

运行以下命令(其中a.out是有效的C可执行文件):

. a.out

...导致出现以下错误:

bash: .: a.out: 无法执行二进制文件

然而,运行以下命令:

./a.out

...成功执行了C语言二进制可执行文件。

显然,这里发生了两种类型的执行,它们有何不同之处?


3
我认为这两个点是两个分开的指令——第一个是源码或点操作符,而第二个只是表示当前目录(如果a.out在子目录b中,您可以使用b / a.out运行它——突然之间没有点,但它与./a.out是相同的命令)。 - David Ferenczy Rogožan
5
Stack Overflow是一个关于编程和开发问题的网站。这个问题似乎不属于编程或开发,因此被认为与主题无关。请参考帮助中心中的 What topics can I ask about here。也许在Suoer UserUnix & Linux Stack Exchange上提问会更合适。 - jww
3
@jww本身就是一个早期问题的复制版本,这个问题最初来自于Unix & Linux Stack ExchangeWhat is the difference between sourcing ('.' or 'source') and executing a file in bash? - StvnW
6个回答

19

Shell使用空格来分隔要运行的命令和其参数。

在第一个示例中,要运行的命令是.,其参数为a.out.命令是shell的快捷方式,用于将包含shell命令的文件名作为其第一个参数并在当前shell中运行这些命令的source命令。 该命令失败,因为a.out是一个二进制文件,而不是shell脚本。

在第二个示例中,要运行的命令是./a.out,这意味着运行当前目录中存储的文件a.out


3
我认为 source 是一个对 . 的非可移植简写,而不是反过来。 - gronostaj
@gronostaj 你是对的。我以为 source 已经被标准化了,但我刚刚查了一下 POSIX,只有 . 在里面。 - Barmar

7
  • ./program 运行位于当前工作目录(./)的名为 program 的文件 (在新的 shell 中运行 shell 脚本)。
  • . 等同于source,它可以在当前 shell中运行 shell 脚本。与 ./program 不同,它不能用于运行二进制文件!例如,您可以使用此命令运行您的 .bashrc shell 脚本,因为您希望此脚本修改您的当前 shell

3
FYI,“source”是“.”的非便携别名。 - R.. GitHub STOP HELPING ICE

4
第一行命令运行 . (点)命令,其参数为 a.out 。 点命令的作用是将文本文件解析为在当前shell环境中执行的命令。 它会报错,因为 a.out 不是文本文件。
第二行运行 ./a.out ,这意味着“当前目录中名为 a.out 的程序”。

3

.单独使用,表示source命令。它会按行读取文件内容,并在当前shell中执行 - 但是,如您所见,这对于二进制可执行文件(而非脚本)无效。

在路径上下文中,例如./.表示当前目录。因此,./a.out表示“在当前目录中运行名为a.out的文件”。


2
众所周知:
. myfile:从 myfile 中执行命令。(类似于 C Shell 中的 source 命令)
./myfile:执行 myfile

进一步说,.本身就是一个命令(并将myfile作为参数传递),而./是文件的(相对)路径。当执行./myfile时,你执行的是当前目录中的可执行文件 myfile
话虽如此,当你想要执行像a.out这样的可执行文件(我假设它是 C 或者 C++ 可执行文件或类似的程序)时,你需要输入./a.out
当你有一堆命令放在一个“文本”文件中,你想要你的 shell 执行它们,你可以输入. myfile。其中最深刻的例子可能是当你更改了.bashrc.profile文件的内容后,你想要"应用"这些更改到系统中。
最后,请不要将.命令与.混淆,后者是你的当前目录(如ls -a 的第一个结果)。

2
. a.out

这段代码将在当前终端使用bash执行a.out中存在的shell脚本。

./a.out

这段代码并不执行任何命令。文件名前的点(.)代表一个隐藏文件[例如:.a.out]。同样地,(./)代表当前工作目录中存在的文件夹。例如:
cd ./documents

上面的代码将会把你的目录切换到文档文件夹。

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