我需要澄清一下我们在终端下运行可执行文件的方式。这可能是一个蹩脚的问题,但使用和运行可执行文件之间有什么区别./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
在命令提示符下键入。