Что такое команда «dot space filename» в bash?

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

export FOO=bar
export FIZZ=buzz

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

. exports.txt

, который будет иметь тот же эффект, что и copy /paste.

Каков механизм работы этой команды «dot space filename»? Трудно думать о поисковых запросах.

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

30 голосов | спросил iancoleman 19 +03002016-10-19T03:34:14+03:00312016bEurope/MoscowWed, 19 Oct 2016 03:34:14 +0300 2016, 03:34:14

3 ответа


40

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

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

ответил Spiff 19 +03002016-10-19T04:18:38+03:00312016bEurope/MoscowWed, 19 Oct 2016 04:18:38 +0300 2016, 04:18:38
26

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

Скажем, у меня есть файл script.sh со следующим содержимым:

cd dir

Если бы я запускал этот скрипт нормально (sh script.sh), я бы увидел следующее:

[email protected]:~$ sh script.sh
[email protected]:~$

Но если я где источник сценария (. script.sh), я бы закончил с этим:

[email protected]:~$ . script.sh
[email protected]:~/dir$

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

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

ответил Olle Kelderman 19 +03002016-10-19T09:26:59+03:00312016bEurope/MoscowWed, 19 Oct 2016 09:26:59 +0300 2016, 09:26:59
4

Вот пример.

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

cat mytest.sh

#!/bin/bash

myvar=1
mystring="Hello World"

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

echo $myvar

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

. mytest.sh

или

source mytest.sh

, а затем

echo $myvar

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

Просто наглядный ответ того, что написал Spiff

ответил raism 19 +03002016-10-19T05:18:46+03:00312016bEurope/MoscowWed, 19 Oct 2016 05:18:46 +0300 2016, 05:18:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132