Відповіді:
Крапка в цьому контексті означає "джерело" вмісту цього файлу в поточну оболонку. З sourceсамої будучи вбудованою командою оболонки. І sourceоператор крапки є синонімами.
Скажіть, у мене був такий вміст у sample.shфайлі.
$ cat sample.sh
echo "hi"
echo "bye?"
Тепер, коли я джерело:
$ . sample.sh
hi
bye?
$
Такі файли часто використовуються для включення команд настройки, таких як додавання речей до змінних середовища.
Скажімо , у мене були ці команди в іншому файлі, addvars.sh.
$ cat addvars.sh
export VAR1="some var1 string"
export VAR2="some var2 string"
Зауважте, що у мене в середовищі поточної оболонки немає змінних.
$ env | grep VAR
$
Тепер, коли я надсилаю цей файл:
$ . addvars.sh
$
Гаразд, не здається, що це щось зробило, але коли ми envзнову перевіримо змінні:
$ env | grep VAR
VAR1=some var1 string
VAR2=some var2 string
Щоб додати відповідь до slm:
Існує два способи запуску сценарію оболонки. Одне - запустити скрипт в окремому процесі, що означає, що все про середовище оболонки (стан пам'яті) повернеться до стану «батьківської» оболонки перед запуском процесу «дочірній оболонки».
Наприклад, поточний робочий каталог (розташування у файловій системі, в якій знаходиться) визначається на основі кожного процесу. Отже, маємо сценарій, який виглядає приблизно так:
#!/bin/bash
cd ~
cd ..
pwd
Отже, назвемо цей сценарій, о , foo. І запустимо цей сценарій наступним чином:./foo
Ми побачимо наступне:
/home
(Стандартна відмова від відповідальності, що існує велика кількість дистрибутивів клонів Linux та інших клонів UNIX, деякі з яких не містять каталогі користувачів /home. Або, як ми говорили "Ваш пробіг може змінюватися")
Тепер після запуску цього сценарію давайте наберемо цю команду
pwd
Щоб побачити, в якому каталозі ми перебуваємо. Ми побачимо щось подібне:
/home/username
Причина знову ж таки, що у сценарію оболонки, який ми запускали, було власне середовище (включаючи власну директорію, де виконувались команди), і це середовище пішло, як тільки сценарій закінчився.
Тепер давайте запустимо такий fooсценарій
. ./foo
Або, рівнозначно:
source ./foo
Якщо ми зробимо pwdзгодом, ми побачимо це:
/home
Причина: пошук скрипту не викликає окремого процесу. Це як вводити всі команди в батьківському процесі вручну; її середовище зберігається після закінчення сценарію.
Дозвольте запропонувати більш простий приклад. Будемо мати сценарій, який виглядає приблизно так:
#!/bin/bash
exit
Давайте назвемо це foo. Давайте переконався , ми можемо запустити його: chmod 755 foo. Тоді давайте запустимо так:
./foo
Нічого не відбувається. Однак, з іншого боку, якщо ми це зробимо:
. ./foo
Або це:
source ./foo
Ми виходимо з системи.
Період (крапка) - це коротка рука для вбудованого баша source. Він буде читати та виконувати команди з файлу в поточному середовищі та повертати статус виходу останньої виконаної команди. Файли можуть бути в поточному каталозі або в будь-якому місці PATH. Його не потрібно виконувати.
# type .
. is a shell builtin
# help .
.: . filename [arguments]
Execute commands from a file in the current shell.
Read and execute commands from FILENAME in the current shell. The
entries in $PATH are used to find the directory containing FILENAME.
If any ARGUMENTS are supplied, they become the positional parameters
when FILENAME is executed.
Exit Status:
Returns the status of the last command executed in FILENAME; fails if
FILENAME cannot be read.
. (джерело або оператор крапки)
Прочитайте та виконайте команди з аргументу імені файлу в поточному контексті оболонки.
Syntax
. filename [arguments]
source filename [arguments]
source є синонімом точки / періоду '.' в bash, але не в POSIX sh, тому для максимальної сумісності використовуйте період.
Коли сценарій запускається з використанням джерела, він запускається в межах наявної оболонки, будь-які змінні, створені або змінені сценарієм, залишаться доступними після завершення сценарію. На відміну від цього, якщо сценарій запускається так само, як ім'я файлу, то для запуску сценарію буде створено окрему підзарядку (з повністю окремим набором змінних).
Існує тонка різниця між виконанням сценарію, виконавши .ss64script (крапка ss64script) та. ss64script (крапковий пробіл ss64script)
перший запускає файл, який був прихований від команди 'ls' (хоча ls -a покаже приховані файли), другий варіант виконує ss64script, навіть якщо він не встановлений як виконуваний файл з chmod.
TL; DR
Крапка така ж, як і вихідна команда.
source - це команда Unix, яка оцінює файл після команди, як список команд, виконаних у поточному контексті.
Витягнуто з https://en.wikipedia.org/wiki/Source_(command)