Назначение экспорта функций в bash

1

Если мы посмотрим на следующий пример:

# testing(){ echo hello;}
# testing
hello
# echo $(testing)
hello
# echo testing >script
# ./script
./script: line 1: testing: command not found
# source ./script
hello
# export -f testing
# ./script
hello

Оказывается, что bashфункцию нужно экспортировать только в том случае, если вы хотите использовать ее в сценарии без источников. Я пробовал несколько уровней подоболочек, поведение одинаковое. Может ли кто-то это подтвердить, потому что я нахожу это противоречащим утверждению, что локальные переменные не существуют в подоболочках.

Ульрик
источник

Ответы:

1

source ./scriptне создает подоболочку. Скрипт выполняется в текущей оболочке. Здесь нет ничего неожиданного.

Однако подстановка команд, подобная in echo $(testing) , создает подоболочку. Если я вас правильно понял, вы удивитесь, что это работает.

Это объясняется в Справочном руководстве Bash, раздел «Среда выполнения команд» [выделено мной]:

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

Таким образом, это документированное исключение из утверждения, что локальные переменные не существуют в подоболочках.

Камил Мачоровский
источник
-1

Функции становятся частью среды процесса, экспортируя их, как переменные. Таким образом, чтобы наследовать их для подпроцессов, таких как вызываемый скрипт, они должны быть экспортированы. Пока он не экспортируется, он является частью только переменных оболочки.

Примечание: вы можете отобразить текущую среду с помощью envвстроенной команды, а список переменных - с помощью set.

Примечание 2: sourceкоманда не создает подоболочку (подпроцесс), как на это указывают другие, поэтому source scriptработает так, как показано в примере. Но ./scriptкоманда создает подоболочку, поэтому вам нужно экспортировать функцию.

Хо Зонг
источник