При использовании оболочки bash я иногда сохраняю переменные окружения в текстовом файле, содержимое которого копирую / вставляю, например, export.txt:
export FOO=bar
export FIZZ=buzz
Кто-то показал мне вместо копирования / вставки, я мог набрать в терминале
. exports.txt
который будет иметь тот же эффект, что и копирование / вставка.
Каков механизм, с помощью которого работает эта команда «имя файла с точечным пространством»? Трудно придумать условия поиска для этого.
Я хочу понять, что происходит, и более общие детали того, что делает этот однострочник.
help .
Это так мало, движок Stack Exchange считает, что он слишком короткий, чтобы быть комментарием.'. ' args
одинарные или двойные кавычки. В противном случае пространство без кавычек пожирается bash, когда он разбирает строку на токены (см. Разделение слов в руководстве по bash)..
issource
, которое буквально означает «команды источника из этого файла», по крайней мере для меня.Ответы:
Команда
.
("точка") является синонимом / ярлыком для встроеннойsource
команды оболочки .Это заставляет именованный скрипт оболочки считываться и выполняться в текущем контексте оболочки (а не в подоболочке). Это позволяет исходному сценарию изменять среду вызывающей оболочки, например устанавливать переменные и определять функции оболочки и псевдонимы.
источник
source
это нестандартный и непереносимый синоним / ярлык для команды «точка» ( ), определенной POSIX.
, а не наоборот.source
и нестандартный.
режим в не POSIX, оба из которых ищут текущий каталог, даже если он не является частью$PATH
. В режиме POSIX он предоставляет стандарт,.
который не ищет текущий каталог, и нетsource
. Ни в одном из режимов это неsource
синоним команды POSIX.
.В то время как два существующих ответа уже превосходны, я чувствую, что пример, где эффект является наиболее "заметным", так сказать, отсутствует.
Допустим, у меня есть файл
script.sh
со следующим содержимым:Если бы я запускал этот скрипт нормально (
sh script.sh
), я бы увидел это:Но если я получу скрипт (
. script.sh
), я получу следующее:Обратите внимание, как во втором случае изменился рабочий каталог нашей основной оболочки!
Это происходит потому , что (как указаны в других ответах) первый пример запускает в своем собственном субоболочке (в
sh
процессе , мы начинаем сsh
-командой, это могло бы быть в принципе любой оболочка,bash
,dash
вы называете его), он изменяет каталог там, ничего не делает и закрывается. В то время как второй пример запускается в нашей основной оболочке, и таким образом там изменяется каталог!источник
Вот пример.
Файл сценария: mytest.sh
если вы попытаетесь распечатать любую из вышеперечисленных переменных, вы ничего не получите
но если вы делаете
или
а потом
это будет печатать 1
Просто визуальный ответ того, что написал Спифф
источник
export
только в том случае, если эти переменные должны использоваться в подоболочках. Я мог бы опуститьexport
в файле, если переменные должны использоваться только в текущей оболочке. Это правильно?