使用 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 所写内容的一个视觉答案