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

Во время следующего отладки отладки для Android eclipse я встречаю следующие команды.

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

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

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

Причина в том, что Sourcing сценарий не вызывает отдельный процесс. Это похоже на ввод всех команд в родительском процессе вручную; его среда сохраняется после завершения сценария.


Позвольте мне придумать более простой пример. Давайте получим скрипт, который выглядит так:

 #!/bin/bash exit 

Назовем это foo . Давайте убедимся, что мы можем запустить его: chmod 755 foo . Затем давайте запустим его так:

 ./foo 

Ничего не произошло. Однако, с другой стороны, если мы это сделаем:

 . ./foo 

Или это:

 source ./foo 

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

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