“.[script]”或"source [script]"、"bash [script] or $SHELL [script]"和“./[script]”或“[script]”之间有什么区别?

What's the difference between: ". [script]" or "source [script]", "bash [script] or $SHELL [script]", and "./ [script]" or "[script]"?

我知道 source. 做同样的事情,如果标题中的其他命令对不做同样的事情我会感到惊讶(因为我'm 运行 bash 因为我的 shell、$SHELL [script]bash [script] 是等价的,对吧??)。

那么三种执行脚本的方式有什么区别呢?我问是因为我刚刚了解到采购脚本是 NOT the exact same 执行它。在某种程度上,我没有从 运行 我的 "experiments" 和阅读手册页中发现明显的。

通过在我编写的非常简单的脚本上盲目调用这些函数,我无法找到其他哪些细微差别? 阅读 above-linked 之后答案,我可以强烈猜测我的问题的答案将是一个非常简单的解释,但我自己几乎从未完全发现过。

这是我做的"experiment":

$. myScript.sh
  "This is the output to my script. I'd like to think it's original."

$source myScript.sh
  "This is the output to my script. I'd like to think it's original."

$bash myScript.sh
  "This is the output to my script. I'd like to think it's original."

$$SHELL myScript.sh
  "This is the output to my script. I'd like to think it's original."

$./myScript.sh 
  "This is the output to my script. I'd like to think it's original."

$myScript.sh 
  "This is the output to my script. I'd like to think it's original."

. scriptsource script在当前环境下执行script的内容,即不创建子shell .从好的方面来说,这允许 script 影响当前环境,例如更改环境变量或更改当前工作目录。不利的一面是,这允许 script 影响当前环境,这是一个潜在的安全隐患。

bash scriptscript 传递给 bash 解释器来执行。 script 本身给出的任何 shebang 都会被忽略。 ("Shebang" 指的是 script 的第一行,例如可以读作 #!/bin/bash,或 #!/usr/bin/perl,或 #!/usr/bin/awk,以指定要使用的解释器。 )

$SHELL scriptscript 传递给 无论您当前要执行的 shell 解释器 是什么。那可能是也可能不是 bash。 (环境变量 SHELL 保存当前 shell 解释器的名称。$SHELL,如果 运行 bash,被评估为 /bin/bash,上一段详述的效果。)

./script 执行当前工作目录script文件的内容。如果没有这样的文件,则会生成错误。 $PATH 的内容对发生的事情没有影响。

script$PATH 中列出的目录中查找文件 script ,它可能包括也可能不包括当前工作目录.执行此目录列表中找到的第一个 script,它可能是也可能不是您当前工作目录中的那个。