Answers:
在这种情况下,点表示将文件的内容“来源”到当前外壳中。随着source
本身是一个shell内建命令。并且 source
,点运算符是同义词。
说我的sample.sh
文件中包含以下内容。
$ cat sample.sh
echo "hi"
echo "bye?"
现在,当我获取它时:
$ . sample.sh
hi
bye?
$
诸如此类的文件通常用于合并设置命令,例如将内容添加到一个环境变量中。
假设我在另一个文件中有这些命令addvars.sh
。
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
请注意,我当前的shell环境中没有任何变量。
$ env | grep VAR
$
现在,当我获取此文件时:
$ . addvars.sh
$
OK,似乎没有做任何事情,但是当我们env
再次检查变量时:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
要添加到slm的答案中:
有两种运行Shell脚本的方法。一种是在单独的进程中运行脚本,这意味着在运行“子” shell进程之前,有关shell环境(内存状态)的所有内容都将还原为“父” shell的状态。
例如,当前的工作目录(在文件系统所在的位置)是基于每个进程确定的。因此,让我们编写一个如下所示的脚本:
#!/bin/bash
cd ~
cd ..
pwd
因此,我们将此脚本称为哦foo
。让我们如下运行该脚本:./foo
我们将看到以下内容:
/home
(标准免责声明那里有大量的Linux和其他UNIX克隆发行版,其中一些不将用户目录放在中/home
。或者,正如我们以前所说的“您的里程可能有所不同”)
现在,在运行此脚本之后,让我们键入此命令
pwd
要查看我们所在的目录。我们将看到类似以下内容:
/home/username
同样,原因是我们运行的Shell脚本具有自己的环境(包括其自己的命令运行目录),并且一旦脚本运行完毕,该环境就消失了。
现在,让我们foo
像这样运行脚本
. ./foo
或者,等效地:
source ./foo
如果我们pwd
随后进行,将看到以下内容:
/home
原因是:采购脚本不会调用单独的进程。就像手动键入父进程中的所有命令一样;脚本结束后,将保留其环境。
让我提出一个简单的例子。让我们编写一个如下所示的脚本:
#!/bin/bash
exit
命名吧foo
。让我们确保我们可以运行它:chmod 755 foo
。然后,让我们像这样运行它:
./foo
什么都没发生。但是,另一方面,如果我们这样做:
. ./foo
或这个:
source ./foo
我们登出。
# type .
. is a shell builtin
# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
。(源或点运算符)
从当前Shell上下文中的filename参数读取并执行命令。
Syntax
. filename [arguments]
source filename [arguments]
source是点/句号“。”的同义词。在bash中,但不在POSIX sh中,因此为了获得最大的兼容性,请使用句点。
当使用源代码运行脚本时,它在现有的Shell中运行,脚本完成后,由脚本创建或修改的任何变量将保持可用。相反,如果脚本仅以文件名的形式运行,则将生成一个单独的子shell(具有一组完全独立的变量)来运行该脚本。
通过运行.ss64script(点ss64script)和来执行脚本之间存在细微的差别。ss64script(点空间ss64script)
第一个选项运行的是从'ls'命令隐藏的文件(尽管ls -a将显示隐藏的文件),第二个选项将执行ss64script,即使尚未将其设置为chmod的可执行文件也是如此。
TL; DR
点与源命令相同。
source是一个Unix命令,它将在当前上下文中执行的命令后的文件评估为命令列表。