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 необходимо экспортировать только в том случае, если вы хотите использовать ее в сценарии без источников. Я пробовал несколько уровней подоболочек, поведение одинаковое. Может кто-то это подтвердить, потому что я считаю это противоречащим утверждению о том, что локальные переменные не существуют в подоболочках.

2 ответа2

1

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

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

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

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

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

-1

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .