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

Ari*_*ler 6 linux bash shell

我知道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."
Run Code Online (Sandbox Code Playgroud)

Dev*_*lar 12

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

bash script传递scriptbash解释器执行.无论shebang 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对发生的事情没有影响.

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

  • 备注:`source` 是 Bashism,`.` 是 POSIX;`$SHELL` 可能会扩展到你的 shell 以外的东西(例如,当运行 dash 时它是 `/bin/bash`)。 (2认同)