简短答案
在您的问题中,第二个命令既不使用.
shell内置程序,也不使用source
内置程序。相反,实际上是通过在名称上调用脚本来像在其他任何可执行文件中一样在单独的外壳中运行脚本。这确实为它提供了一组单独的变量(尽管如果在其父外壳中导出变量,它将是任何子进程的环境变量,因此将包含在子外壳的变量中)。如果将更/
改为空格,则可以使用.
内置的空格来运行它source
。
扩展说明
这是source
内置Shell 的语法,该语法在当前Shell中执行脚本的内容(并使用当前Shell的变量):
source testenv.sh
这是.
内置语法,其功能与source
:
. testenv.sh
但是,此语法将脚本作为可执行文件运行,并启动新的shell来运行它:
./testenv.sh
那不是使用.
内置的。相反,它.
是您正在执行的文件的路径的一部分。一般来说,可以通过使用至少包含一个/
字符的名称来调用外壳程序中的任何可执行文件。因此,在当前目录下运行文件./
是最简单的方法。除非当前目录在您的目录中PATH
,否则无法使用命令运行脚本testenv.sh
。这是为了防止人们在打算执行系统命令或PATH
环境变量中列出的某个目录中存在的其他文件时意外执行当前目录中的文件。
由于按名称运行文件(而不是使用source
或.
),因此在新的外壳中运行该文件,因此它将具有自己的外壳变量集。新的shell 确实从调用过程中继承了环境变量(在本例中是您的交互式shell),这些环境变量的确成为了新shell中的shell变量。但是,要将shell变量传递给新的shell,必须满足以下条件之一:
shell变量已被导出,使其成为环境变量。export
为此使用内置的shell。在您的示例中,您可以使用export MY_VAR=12345
一步来设置和导出变量,或者如果已经设置了变量,则可以简单地使用export MY_VAR
。
shell变量是为您正在运行的命令显式设置和传递的,因此在运行命令期间,它是一个环境变量。通常,这可以实现以下目的:
MY_VAR=12345 ./testenv.sh
如果MY_VAR
是尚未导出的shell变量,你甚至可以运行testenv.sh
与MY_VAR
作为环境变量传递通过它设置到其自身:
MY_VAR="$MY_VAR" ./testenv.sh
./
脚本的语法需要哈希行才能正常工作
顺便说一句,请注意,当您按上述名称调用可执行文件(而不是使用.
或source
shell内置程序)时,用于运行该程序的shell程序通常并不取决于您从哪个shell运行该程序。 。代替:
对于二进制文件,可以将内核配置为运行该特定类型的文件。它检查文件的前两个字节是否有“幻数”,该“幻数”指示文件的二进制可执行文件类型。这是可执行二进制文件能够运行的方式。
当然,这非常重要,因为没有外壳程序或其他解释程序(一个可执行的二进制文件)就无法运行脚本!另外,许多命令和应用程序都是编译的二进制文件,而不是脚本。
(#!
是表示文本可执行文件的“魔术数字”的文本表示。)
对于应该以Shell或其他解释语言运行的文件,第一行如下所示:
#!/bin/sh
/bin/sh
可以用任何其他要运行该程序的外壳程序或解释程序替换。例如,Python程序可能以以下行开头:
#!/usr/bin/python
这些行称为hashbang,shebang和许多其他相似的名称。请参阅此FOLDOC条目,此Wikipedia文章以及解释器是否读取#!/ bin / sh?欲获得更多信息。
如果一个文本文件被标记为可执行文件,并且您从shell中运行它(例如./filename
),但它不是以开头#!
,则内核将无法执行它。但是,看到发生了这种情况,您的shell将通过将其名称传递给某些 shell 来尝试运行它。有一些要求放在什么壳是(“壳应具有外壳执行命令调用等同......”)。在实践中,某些外壳程序(包括*)运行其自身的另一个实例,而另一些使用bash
/bin/sh
。我强烈建议您避免这种情况,而改用hashbang行(或通过将脚本传递给所需的解释器(例如bash filename
)来运行脚本)。
* GNU Bash手册,3.7.2命令搜索和执行:“如果由于文件不是可执行文件格式并且该文件不是目录而导致执行失败,则假定它是一个Shell脚本,并且Shell按照说明执行它在Shell脚本中。”
source
是,这些功能可以从bash中获得,而无需再次加载或启动。实例#!/bin/bash function olakease {echo olakease;}
。加载后,source file.sh
您可以直接olakease
从bash 调用。我真的很喜欢 源代码执行,然后加载很多东西,点.
仅用于执行,就像使用一样bash file.sh