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



我知道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."

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

bash scriptscript传递给bash解释器执行。无论舍邦是什么,script本身都会被忽略。("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,该可能是也可能不是当前工作目录中的目录。

最新更新