Что означает точка перед командой в оболочке?

76

Следуя руководству по отладке android eclipse, я сталкиваюсь со следующими командами.

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

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

Jichao
источник

Ответы:

80

Точка в этом контексте означает «источник» содержимого этого файла в текущей оболочке. С 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
источник
72

Чтобы добавить к ответу 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

Мы вышли из системы.

samiam
источник
6
Ваш ответ лучше принятого, я понял, как вы объяснили, спасибо!
Ахмед
Дун-да-да-duuuun! (барабанная дробь, пожалуйста) ... и здесь самая важная фраза ! : Причина в том, что поиск сценария не вызывает отдельного процесса. Это похоже на ввод всех команд в родительском процессе вручную; его среда сохраняется после завершения сценария.
Габриэль Стейплс
Вы должны привести со вторым примером. Это упаковывает больше удара.
MonoThreaded
5

Точка (точка) является короткой стрелкой для встроенного bash source. Он будет читать и выполнять команды из файла в текущей среде и возвращать состояние завершения последней выполненной команды. Файлы могут находиться в текущем каталоге или в любом месте PATH. Это не должно быть исполняемым.

tlund
источник
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-Делор
источник
Я думаю, что в руководстве отсутствует запятая. Должно быть написано «Выполнять команды из файла в текущей оболочке».
Ctrl-Alt-Delor
1

, (оператор источника или точки)
Чтение и выполнение команд из аргумента имени файла в текущем контексте оболочки.

Syntax
      . filename [arguments]

      source filename [arguments]

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

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

Существует небольшая разница между выполнением сценария с помощью .ss64script (точка ss64script) и. ss64script (точка пространства ss64script)

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

Источник

Premraj
источник
0

TL; DR

Точка совпадает с исходной командой.

source - это команда Unix, которая оценивает файл, следующий за командой, как список команд, выполняемых в текущем контексте.

Извлечено из https://en.wikipedia.org/wiki/Source_(command)

mochomecha
источник
2
Добро пожаловать в U & L! Этот ответ дублирует информацию, которая уже есть в принятом ответе , и ничего не добавляет.
JigglyNaga