“点空格文件名”命令在 bash 中起什么作用?

“点空格文件名”命令在 bash 中起什么作用?

使用 bash shell 时,我有时会将环境变量保存在一个文本文件中,并复制/粘贴其内容,例如 exports.txt:

export FOO=bar
export FIZZ=buzz

有人向我展示了如何在终端中输入,而不是复制/粘贴

. exports.txt

其效果与复制/粘贴相同。

这个“点空格文件名”命令的工作机制是什么?很难想出它的搜索词。

我想了解正在发生的事情以及此一行程序所执行的更一般的细节。

答案1

(“点”)命令.是 shell 内置source命令的同义词/快捷方式。

它使得指定的 shell 脚本在当前 shell 上下文(而不是子 shell)中被读入并执行。这允许源脚本修改调用 shell 的环境,例如设置变量和定义 shell 函数和别名。

答案2

虽然现有的两个答案已经非常出色,但我觉得缺少了效果最“明显”的例子。

script.sh假设我有一个包含以下内容的文件:

cd dir

如果我正常运行这个脚本(sh script.sh),我会看到以下内容:

olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$

但是如果我在哪里获取脚本(. script.sh),我最终会得到这样的结果:

olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$

注意在第二种情况下我们主 shell 的工作目录是如何改变的!

这是因为(正如其他答案所指出的那样)第一个示例在其自己的子 shell 中运行(sh我们使用sh-command 启动的进程,这基本上可以是任何 shell,,,bash随便dash你怎么说),它在那里更改目录,不执行任何操作并关闭。而第二个示例在我们的主 shell 中运行,因此在那里更改目录!

答案3

这是一个例子。

脚本文件:mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

如果你尝试打印上述任何变量,你将什么也得不到

echo $myvar

但如果你这样做

. mytest.sh

或者

source mytest.sh

进而

echo $myvar

它将打印 1

这只是 Spiff 所写内容的一个视觉答案

相关内容