Интересный вопрос сегодня залетел:

Давай посмотрим что происходит в кишках в это время. Давненько мы с тобой в strace не смотрели.

Предположим есть Bash-скрипт с функциями:

functions.sh

#!/bin/bash

bashdays_function() {
  echo "Hello from BashDays"
}

И основной скрипт, который сорсит файл с функциями:

test_script.sh

#!/bin/bash

source ./functions.sh

bashdays_function
bashdays_function

Не забываем сделать: chmod +x test_script.sh.

Запускаем test_script.sh под контролем strace:

strace -e trace=openat ./test_script.sh

И видим:

openat(AT_FDCWD, "./test_script.sh", O_RDONLY) = 3
openat(AT_FDCWD, "./functions.sh", O_RDONLY) = 3

Hello from BashDays
Hello from BashDays

То есть в контексте скрипта test_script.sh файл с функциями был прочитан один раз.

При втором вызове функции всё считалось из памяти.

Если бы файл functions.sh читался каждый раз, то мы увидели бы несколько строчек openat(AT_FDCWD).

Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Грубо говоря при каждом запуске test_script.sh подключенный файл через source будет прочитан один раз.

Вроде очевидно, но порой заставляет задуматься.

Изучай!