Ответы:
Точка в этом контексте означает «источник» содержимого этого файла в текущей оболочке. С 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
Мы вышли из системы.
Точка (точка) является короткой стрелкой для встроенного bash 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)