我知道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."
答案 0 :(得分:11)
. script
和source script
执行当前环境中<{1}} 的内容,即不创建子shell。从好的方面来说,这允许script
影响当前环境,例如更改环境变量或更改当前工作目录。在缺点方面,这允许script
影响当前环境,这是一个潜在的安全隐患。
script
将bash 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
的内容对发生的事情没有影响。
$PATH
在script
中列出的目录中查找文件script
,该文件可能包含也可能不包含当前工作目录。执行此目录列表中的第一个$PATH
,可能是也可能不是当前工作目录中的那个。