bash中的“点空间文件名”命令是做什么的?


30

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

export FOO=bar
export FIZZ=buzz

有人告诉我而不是复制/粘贴,我可以在终端中输入

. exports.txt

与复制/粘贴具有相同的效果。

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

我想了解正在发生的事情,以及该单线正在做什么的更一般的细节。


23
运行help . 这太短了,Stack Exchange引擎认为它太短了,无法发表评论。
通配符

5
我想知道为什么所有这些问题也会在此站点中发生。他们在Stack OverflowAsk UbuntuUnix&Linux中得到了很多回答。
fedorqui '16

要运行点空间,您需要输入'. ' args,用单引号或双引号引起来。否则,当bash将行解析为令牌时,bash会将未引用的空间吞噬(请参见bash手册中的“分词”)。
彼得·科德斯

1
在bash中,的替代名称.source,至少对我而言意味着“从此文件中获取命令”。
jpaugh

Answers:


40

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

它使命名的Shell脚本在当前Shell上下文(而不是子Shell)中读取并执行。这允许源脚本修改调用外壳程序的环境,例如设置变量以及定义外壳程序功能和别名。


49
实际上,这sourcePOSIX定义的 “点”(.)命令的非标准且不可移植的同义词/快捷方式,而不是相反。

8
bash 在非POSIX模式下提供了非标准source和非标准的内容.,即使当前目录不是的一部分,bash 也会搜索当前目录$PATH。在POSIX模式下,它提供了.不搜索当前目录的标准,并且没有source。在这两种模式下source,POSIX的.命令都不是同义词。
2016年

26

尽管现有的两个答案已经非常出色,但我觉得缺少一个可以说效果最“明显”的例子。

说我有一个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第一个例子中运行(在sh我们与启动过程sh-command,这可能是基本上任何shell, ,bashdash你的名字),它改变目录中有,什么也不做,然后关闭。尽管第二个示例在我们的主shell中运行,并因此在其中更改目录!


4

这是一个例子。

脚本文件:mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

如果您尝试打印上述任何变量,您将一无所获

echo $myvar

但是如果你这样做

. mytest.sh

要么

source mytest.sh

然后

echo $myvar

它会打印1

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


因此,解释您的示例时,export仅在子shell中使用这些变量时才使用。export如果变量仅在当前shell中使用,则可以在文件中省略。那正确吗?
iancoleman '16

1
完全正确,我可以说是。但是,如果您考虑外壳环境变量,则使用export命令更有用或更容易理解。例如$ HOME或$ DISPLAY。是的,您可以使用export命令在shell会话或任何子shell上导出变量,但是一旦终止该会话,该变量将消失。
raism
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.