Answers:
该. executable
语法仅对任何可执行文件都无效(或者对吗?)。相反,它是source
内置bash的别名。所以区别主要与bash脚本有关,事实是它们是完全不同的东西:)
./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从文件中读取命令,就像在命令行中键入命令一样。没有新的外壳产生。
观察其行为的一种非常简单的方法是编写仅包含的脚本exit
。如果是./script
这样,似乎什么也不会发生,这是因为启动了新的Shell进程,exit
命令退出了该新 Shell,并且当前的Shell不受影响。
如果您使用. script
,则当前终端将关闭,因为该exit
命令在当前shell中运行。因此,这等效exit
于在命令提示符下键入。
ls
输出的方式:键入命令,命令运行,显示输出,然后结束,但输出仍保留在终端中。
bash
运行的shell 给出。如果输入bash
,将运行另一个 shell;对于第一个shell,这只是一个要运行的程序。如果键入exit
,则将关闭您启动的最后一个外壳,但仍位于第一个外壳(启动终端时的外壳)中。同样,这一切都发生在同一终端内。