При использовании оболочки 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
Просто визуальный ответ на то, что написал Спифф