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, когда содержимое файла встраивается непосредственно в текущий контекст.