我知道source
和.
做同样的事情,如果标题中的其他命令对不是这样,我会惊讶地发现(因为我运行的bash就像我的shell一样,$SHELL [script]
和bash [script]
是等价的,对吧??
那么执行脚本的三种方法有什么区别呢?我问是因为我刚刚了解到采购脚本与执行它并不完全相同。在某种程度上,我从运行我的"实验"和阅读手册页中没有发现明显。
在我编写的非常简单的脚本上盲目调用这些函数,我无法发现哪些其他细微差异?在阅读了上面链接的答案后,我可以强烈猜测我的问题的答案将是一个非常简单的解释,但以一种我几乎永远不会完全发现自己的方式。
这是我做的"实验":
$. 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."
. script
和source script
当前环境中执行script
的内容,即不创建子shell。从好的方面来说,这允许script
影响当前环境,例如更改环境变量或更改当前工作目录。不利的一面是,这允许script
影响当前环境,这是一个潜在的安全隐患。
bash script
script
传递给bash
解释器执行。无论舍邦是什么,script
本身都会被忽略。("Shebang"是指script
的第一行,例如可以读作#!/bin/bash
,或#!/usr/bin/perl
,或#!/usr/bin/awk
,以指定要使用的解释器。
$SHELL script
script
传递给您当前的 shell 解释器来执行。这可能是,也可能不是,bash
.(环境变量SHELL
保存当前 shell 解释器的名称。$SHELL
,如果运行 bash,则评估为/bin/bash
,效果详见上一段。
./script
执行当前工作目录中script
的文件的内容。如果没有此类文件,则会生成错误。$PATH
的内容对发生的事情没有影响。
script
在$PATH
中列出的目录中查找script
的文件,其中可能包括也可能不包括当前工作目录。将执行在此目录列表中找到的第一个script
,该可能是也可能不是当前工作目录中的目录。