Что команда 'точка пространства имени файла' делает в bash?


30

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

export FOO=bar
export FIZZ=buzz

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

. exports.txt

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

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

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


23
Выполнить help . Это так мало, движок Stack Exchange считает, что он слишком короткий, чтобы быть комментарием.
Wildcard

5
Интересно, почему все эти вопросы встречаются и на этом сайте? На них много раз отвечали в переполнении стека , Ask Ubuntu и Unix & Linux .
Федорки

Чтобы запустить пробел, вам нужно набрать '. ' argsодинарные или двойные кавычки. В противном случае пространство без кавычек пожирается bash, когда он разбирает строку на токены (см. Разделение слов в руководстве по bash).
Питер Кордес

1
В bash альтернативное имя для .is source, которое буквально означает «команды источника из этого файла», по крайней мере для меня.
jpaugh

Ответы:


40

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

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


49
На самом деле, sourceэто нестандартный и непереносимый синоним / ярлык для команды «точка» ( ), определенной POSIX. , а не наоборот.
тердон

8
bash предоставляет нестандартный sourceи нестандартный .режим в не POSIX, оба из которых ищут текущий каталог, даже если он не является частью $PATH. В режиме POSIX он предоставляет стандарт, .который не ищет текущий каталог, и нет source. Ни в одном из режимов это не sourceсиноним команды POSIX ..
HVd

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$

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

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


4

Вот пример.

Файл сценария: mytest.sh

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

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

echo $myvar

но если вы делаете

. mytest.sh

или

source mytest.sh

а потом

echo $myvar

это будет печатать 1

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


Таким образом, интерпретируя ваш пример, использование exportтолько в том случае, если эти переменные должны использоваться в подоболочках. Я мог бы опустить exportв файле, если переменные должны использоваться только в текущей оболочке. Это правильно?
Янколеман

1
Совершенно верно, и я мог бы сказать, да. Однако использование команды экспорта более полезно или более понятно, если вы думаете о переменных среды оболочки. Например, $ HOME или $ DISPLAY. Да, вы можете использовать команду экспорта, чтобы экспортировать переменную в сеансе оболочки или в любой подоболочке, но она исчезнет, ​​как только вы прекратите этот сеанс.
raism
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.