有什么区别:“。[script]”或“source [script]”,“bash [script]或$ SHELL [script]”,以及“./ [script]”或“[script]”?

时间:2017-08-18 16:52:59

标签: linux bash shell

我知道source.做同样的事情,我会惊讶地发现标题中的其他命令对不是那么相同(因为我是将bash作为我的shell运行,$SHELL [script]bash [script]是等价的,对吧?)。

那么执行脚本的三种方法有什么区别?我问,因为我刚刚得知脚本的执行是NOT the exact same。在某种程度上,我没有从运行“实验”和阅读手册页中找到明显的方法。

在我写过的令人难以置信的简单脚本上盲目地调用这些函数时,我找不到的其他细微差别是什么?在阅读了上述相关答案后,我可以强烈猜测我的问题的答案将是一个非常简单的解释,但我自己几乎从未完全发现过。

这是我做过的“实验”:

$. 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."

1 个答案:

答案 0 :(得分:11)

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

scriptbash script传递给script解释器以执行。无论bash本身给出了什么,都会被忽略。 (&#34; Shebang&#34;指的是script的第一行,例如,可以阅读script#!/bin/bash#!/usr/bin/perl来指定解释器使用。)

#!/usr/bin/awk$SHELL script传递给要执行的当前shell解释器。那可能是,也可能不是script。 (环境变量bash包含当前shell解释器的名称。SHELL,如果运行bash,则计算为$SHELL,其效果在前一段中详细说明。)

/bin/bash执行当前工作目录中文件./script 的内容。如果没有此类文件,则会生成错误。 script的内容对发生的事情没有影响。

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