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

ian*_*man 33 bash export

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

export FOO=bar
export FIZZ=buzz
Run Code Online (Sandbox Code Playgroud)

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

. exports.txt
Run Code Online (Sandbox Code Playgroud)

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

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

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

Spi*_*iff 46

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

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

  • 实际上,`source` 是 [POSIX-defined](http://pubs.opengroup.org/onlinepubs/009695399/utilities/dot.html) "dot" (` .`) 命令,而不是相反。 (50认同)
  • bash 在非 POSIX 模式下提供了一个非标准的 `source` 和一个非标准的 `.`,它们都会搜索当前目录,即使它不是 `$PATH` 的一部分。在 POSIX 模式下,它提供了一个标准的 `.`,它不搜索当前目录,也没有 `source`。在这两种模式下,`source` 都不是 POSIX 的 `.` 命令的同义词。 (8认同)

小智 30

虽然现有的两个答案已经很好,但我觉得效果最“明显”的例子缺失了。

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

cd dir
Run Code Online (Sandbox Code Playgroud)

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

olle@OMK2-SERVER:~$ sh script.sh
olle@OMK2-SERVER:~$
Run Code Online (Sandbox Code Playgroud)

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

olle@OMK2-SERVER:~$ . script.sh
olle@OMK2-SERVER:~/dir$
Run Code Online (Sandbox Code Playgroud)

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

这是因为(正如其他答案中所指出的)第一个示例在它自己的子shell 中运行(sh我们以sh-command开始的进程,这基本上可以是任何 shell,bash, dash,你命名的),它在那里更改目录,什么都不做并关闭。虽然第二个示例在我们的主 shell 中运行,因此更改了那里的目录!


小智 5

这是一个例子。

脚本文件:mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"
Run Code Online (Sandbox Code Playgroud)

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

echo $myvar
Run Code Online (Sandbox Code Playgroud)

但如果你这样做

. mytest.sh
Run Code Online (Sandbox Code Playgroud)

或者

source mytest.sh
Run Code Online (Sandbox Code Playgroud)

进而

echo $myvar
Run Code Online (Sandbox Code Playgroud)

它将打印 1

只是对 Spiff 所写内容的直观回答