12

我知道这一点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."
4

1 回答 1

19

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

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

$SHELL script传递script您当前要执行的 shell 解释器。这可能是,也可能不是bash。(环境变量SHELL包含当前 shell 解释器的名称。$SHELL如果运行 bash,则计算结果为/bin/bash,其效果在上一段中详述。)

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

scriptscript 在 中列出的目录中$PATH查找文件,该文件可能包括也可能不包括当前工作目录。在这个目录列表中找到的第一个script被执行,它可能是也可能不是你当前工作目录中的那个。

于 2017-08-18T17:00:59.493 回答