Яке значення крапки перед командою в оболонці?


74

Під час виконання підручника з налагодження андроїдських затемнень я зустрічаю наступні команди.

cd /path/to/android/root 
. build/envsetup.sh 
lunch 1    
make       
emulator

Моя проблема в тому, що build/envsetup.shозначає крапка перед ?

Відповіді:


78

Крапка в цьому контексті означає "джерело" вмісту цього файлу в поточну оболонку. З 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

70

Щоб додати відповідь до 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

Ми виходимо з системи.


6
Ваша відповідь краща за прийняту, я зрозумів, як ви пояснили, дякую!
Ахмед

5

Період (крапка) - це коротка рука для вбудованого баша source. Він буде читати та виконувати команди з файлу в поточному середовищі та повертати статус виходу останньої виконаної команди. Файли можуть бути в поточному каталозі або в будь-якому місці PATH. Його не потрібно виконувати.


1

Як дізнатися.

# 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.

Я думаю, що в посібнику не вистачає кома. Слід сказати: "Виконати команди з файлу в поточній оболонці".
ctrl-alt-delor

1

. (джерело або оператор крапки)
Прочитайте та виконайте команди з аргументу імені файлу в поточному контексті оболонки.

Syntax
      . filename [arguments]

      source filename [arguments]

source є синонімом точки / періоду '.' в bash, але не в POSIX sh, тому для максимальної сумісності використовуйте період.

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

Існує тонка різниця між виконанням сценарію, виконавши .ss64script (крапка ss64script) та. ss64script (крапковий пробіл ss64script)

перший запускає файл, який був прихований від команди 'ls' (хоча ls -a покаже приховані файли), другий варіант виконує ss64script, навіть якщо він не встановлений як виконуваний файл з chmod.

Джерело


0

TL; DR

Крапка така ж, як і вихідна команда.

source - це команда Unix, яка оцінює файл після команди, як список команд, виконаних у поточному контексті.

Витягнуто з https://en.wikipedia.org/wiki/Source_(command)


2
Ласкаво просимо до U&L! Ця відповідь дублює інформацію, яка вже є прийнятою відповіддю , і насправді нічого не додає.
JigglyNaga
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.