“.[script]”或"source [script]"、"bash [script] or $SHELL [script]"和“./[script]”或“[script]”之间有什么区别?
What's the difference between: ". [script]" or "source [script]", "bash [script] or $SHELL [script]", and "./ [script]" or "[script]"?
我知道 source
和 .
做同样的事情,如果标题中的其他命令对不做同样的事情我会感到惊讶(因为我'm 运行 bash 因为我的 shell、$SHELL [script]
和 bash [script]
是等价的,对吧??)。
那么三种执行脚本的方式有什么区别呢?我问是因为我刚刚了解到采购脚本是 NOT the exact same 执行它。在某种程度上,我没有从 运行 我的 "experiments" 和阅读手册页中发现明显的。
通过在我编写的非常简单的脚本上盲目调用这些函数,我无法找到其他哪些细微差别? 阅读 above-linked 之后答案,我可以强烈猜测我的问题的答案将是一个非常简单的解释,但我自己几乎从未完全发现过。
这是我做的"experiment":
$. 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."
. script
和source script
在当前环境下执行script
的内容,即不创建子shell .从好的方面来说,这允许 script
影响当前环境,例如更改环境变量或更改当前工作目录。不利的一面是,这允许 script
影响当前环境,这是一个潜在的安全隐患。
bash script
将 script
传递给 bash
解释器来执行。 script
本身给出的任何 shebang 都会被忽略。 ("Shebang" 指的是 script
的第一行,例如可以读作 #!/bin/bash
,或 #!/usr/bin/perl
,或 #!/usr/bin/awk
,以指定要使用的解释器。 )
$SHELL script
将 script
传递给 无论您当前要执行的 shell 解释器 是什么。那可能是也可能不是 bash
。 (环境变量 SHELL
保存当前 shell 解释器的名称。$SHELL
,如果 运行 bash,被评估为 /bin/bash
,上一段详述的效果。)
./script
执行当前工作目录中script
文件的内容。如果没有这样的文件,则会生成错误。 $PATH
的内容对发生的事情没有影响。
script
在 $PATH
中列出的目录中查找文件 script
,它可能包括也可能不包括当前工作目录.执行此目录列表中找到的第一个 script
,它可能是也可能不是您当前工作目录中的那个。
我知道 source
和 .
做同样的事情,如果标题中的其他命令对不做同样的事情我会感到惊讶(因为我'm 运行 bash 因为我的 shell、$SHELL [script]
和 bash [script]
是等价的,对吧??)。
那么三种执行脚本的方式有什么区别呢?我问是因为我刚刚了解到采购脚本是 NOT the exact same 执行它。在某种程度上,我没有从 运行 我的 "experiments" 和阅读手册页中发现明显的。
通过在我编写的非常简单的脚本上盲目调用这些函数,我无法找到其他哪些细微差别? 阅读 above-linked 之后答案,我可以强烈猜测我的问题的答案将是一个非常简单的解释,但我自己几乎从未完全发现过。
这是我做的"experiment":
$. 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."
. script
和source script
在当前环境下执行script
的内容,即不创建子shell .从好的方面来说,这允许 script
影响当前环境,例如更改环境变量或更改当前工作目录。不利的一面是,这允许 script
影响当前环境,这是一个潜在的安全隐患。
bash script
将 script
传递给 bash
解释器来执行。 script
本身给出的任何 shebang 都会被忽略。 ("Shebang" 指的是 script
的第一行,例如可以读作 #!/bin/bash
,或 #!/usr/bin/perl
,或 #!/usr/bin/awk
,以指定要使用的解释器。 )
$SHELL script
将 script
传递给 无论您当前要执行的 shell 解释器 是什么。那可能是也可能不是 bash
。 (环境变量 SHELL
保存当前 shell 解释器的名称。$SHELL
,如果 运行 bash,被评估为 /bin/bash
,上一段详述的效果。)
./script
执行当前工作目录中script
文件的内容。如果没有这样的文件,则会生成错误。 $PATH
的内容对发生的事情没有影响。
script
在 $PATH
中列出的目录中查找文件 script
,它可能包括也可能不包括当前工作目录.执行此目录列表中找到的第一个 script
,它可能是也可能不是您当前工作目录中的那个。