sourcing
Исполнение
Напишем такой скрипт с названием script.sh
#!/usr/bin/env sh
cd /
и выполним такие команды:
chmod u+x script.sh
pwd
./script.sh
pwd
Что будет выведено?
Ответ: дважды путь одной и той же директории, в которой мы всё это запускаем.
Исполнение
Почему так получается? Дело в том, что запустится новый процесс shell, у нового процесса сменится рабочая директория, затем исполнение завершится.
Рабочая директория процесса, который выполнил /usr/bin/env sh script.sh
, не изменится.
Аналогично могли поменять рабочую директорию у дочернего процесса так:
sh -c 'cd /'
pwd
sourcing
А вот выполнение такой
. script.sh
или такой команды, что аналогично:
source script.sh
приведёт к изменению рабочей директории текущего shell.
Команда source
(или .
) означает “исполни текст в этом файле, не запуская новый shell”. Отсюда название sourcing.
Это аналогично директиве #include
в C или import
в Python, когда содержимое файла встраивается непосредственно в текущий контекст.