Что делает команда «точка пробел имя_файла» в bash?

Что делает команда «точка пробел имя_файла» в bash?

При использовании оболочки bash я иногда сохраняю переменные окружения в текстовом файле, содержимое которого копирую/вставляю, например, exports.txt:

export FOO=bar
export FIZZ=buzz

Кто-то показал мне, что вместо копирования/вставки я могу ввести в терминале

. exports.txt

что имело бы тот же эффект, что и копирование/вставка.

Каков механизм работы этой команды 'точка пробел имя файла'? Трудно придумать для нее поисковые термины.

Я хочу понять, что происходит, и более общие детали того, что делает этот однострочник.

решение1

Команда .(«точка») является синонимом/сочетанием клавиш для встроенной sourceкоманды оболочки.

Это приводит к тому, что именованный скрипт оболочки считывается и выполняется в текущем контексте оболочки (а не в подоболочке). Это позволяет исходному скрипту изменять среду вызывающей оболочки, например, устанавливать переменные и определять функции оболочки и псевдонимы.

решение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$

Обратите внимание, как во втором случае изменился рабочий каталог нашей основной оболочки!

Это потому, что (как указано в других ответах) первый пример работает в своей собственной подоболочке (процесс, который shмы запускаем с помощью -команды sh, это могла бы быть в принципе любая оболочка, bash, dash, как вы ее назовете), он меняет там каталог, ничего не делает и закрывается. В то время как второй пример работает в нашей основной оболочке и, таким образом, меняет там каталог!

решение3

Вот пример.

Файл скрипта: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

если вы попытаетесь напечатать любую из вышеперечисленных переменных, вы ничего не получите

echo $myvar

но если ты это сделаешь

. mytest.sh

или

source mytest.sh

а потом

echo $myvar

он напечатает 1

Просто визуальный ответ на то, что написал Спифф

Связанный контент