30

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

export FOO=bar
export FIZZ=buzz

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

. exports.txt

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

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

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

3 ответа3

40

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .