./ 与 . 在终端下运行程序

./ 与 . 在终端下运行程序

我需要澄清一下我们在终端下运行可执行文件的方式。这可能是一个蹩脚的问题,但使用和运行可执行文件之间有什么区别./an_executable. an_executable假设我们在 an_executable 所在的目录中)

我已经知道前者会让 shell 在当前目录中查找 an_executable ( .),但是为什么使用后一个版本时/不需要a 呢?.

提前致谢。

答案1

该语法并不适用于任何可执行文件(或者可以吗?)。相反,它是 bash内置. executable的别名。因此,差异主要与 bash 脚本有关,而事实是它们是完全不同的东西 :)source

./executable要求“正常”运行可执行文件。./是当前路径的相对引用。这样可以避免让 shell (bash) 尝试在其目录中定位可执行文件$PATH(如果您没有在命令中指定路径,它就会这样做)。您不能这样做的原因之一executable是出于安全考虑;假设您解压缩下载的存档,并且其中包含恶意版本的ls。如果它直接从当前目录运行,您会在不知不觉中运行该版本。

另一方面,. executable表示“获取名为 的文件executable”。由于您直接命名文件,并且它实际上不必是可执行文件,因此 $PATH 的安全限制不适用。获取只会“运行”(或似乎运行)shell 脚本。它的作用是:

   source filename [arguments]
          Read and execute commands from filename  in  the  current  shell
          environment  and return the exit status of the last command exe‐
          cuted from filename.

那么... 执行和采购之间到底有什么区别?假设有相同的 shell 脚本,执行它 ( ./script) 将生成一个新 shell,在该 shell 内运行脚本,当脚本退出时,关闭该 shell 并返回到父 shell。实际上,它将启动一个新bash进程来执行脚本。

. script)将导致当前的shell 从文件中读取命令,就像在命令行中输入命令一样。不会生成新的 shell。

一个非常简单的方法来观察它的行为是编写一个只包含的脚本exit。如果你./script这样做,似乎什么都不会发生,这是因为启动了一个新的 shell 进程,exit命令退出了新的shell 并且您当前的 shell 不受影响。

如果您. script,您当前的终端将关闭,因为该exit命令在当前 shell 中运行。因此,这相当于exit在命令提示符下键入。

相关内容