Що виконує команда "dot space filename" у bash?


30

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

export FOO=bar
export FIZZ=buzz

Хтось показав мені замість copy / paste, я міг би набрати термінал

. exports.txt

які мали б той самий ефект, що і copy / paste.

Яким є механізм, за допомогою якого працює команда "dot space filename"? Важко подумати про пошукові терміни.

Я хочу зрозуміти, що відбувається, і більш загальні відомості про те, що робить цей лайнер.


23
Запустити help . Це настільки короткий двигун Stack Exchange думає, що це занадто коротке, щоб бути коментарем.
Wildcard

5
Цікаво, чому всі ці питання трапляються і на цьому сайті. Їм відповідали багато разів Переповнення стеку , Запитайте Ubuntu і Unix & amp; Linux .
fedorqui

Щоб запустити точкове простір, потрібно ввести '. ' args, з одинарними або подвійними лапками. В іншому випадку незашифрований простір з'їдається bash, коли він розбирає рядок на токени (див. "Розбиття слова" у bash).
Peter Cordes

1
У bash альтернативне ім'я для . є source, що буквально означає "вихідні команди з цього файлу", принаймні для мене.
jpaugh

Відповіді:


40

The . ("точка") - це синонім / ярлик для вбудованої оболонки source команду.

Це призводить до того, що іменований скрипт оболонки буде зчитуватися і виконуватися в поточному контексті оболонки (а не в підкрослі). Це дозволяє джерельному сценарію змінювати середовище викликає оболонки, наприклад, встановлювати змінні і визначати функції оболонки і псевдоніми.


49
Власне, source є нестандартним і непереносимим синонімом / ярликом для POSIX-визначено "крапка" ( . ) команду, а не навпаки.
terdon

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 у файлі, якщо змінні будуть використовуватися тільки в поточній оболонці. Це так?
iancoleman

1
Цілком правильно, і я можу сказати «так». Однак використання команди export є більш корисним або більш зрозумілим, якщо ви думаєте про змінні оболонки оболонки. Наприклад $ HOME або $ DISPLAY. Так, ви можете скористатися командою експорту, щоб експортувати змінну на оболонку або будь-яку з дочірніх оболонок.
raism
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.