SSH сессия не экспортирует функции

У меня есть куча функций, хранящихся в ~/.bash_functions, который получен ~/.bashrc при запуске оболочки. Файл экспортирует все функции следующим образом:

# Find functions in this script based on a grep search, and export them.
grep ^'[[:alnum:]]' ~/.bash_functions |
  grep '()' |
  cut -d'(' -f1 | 
  while read function
do
  export -f "$function"
done
unset function

Это прекрасно работает на локальной оболочке, но не через SSH. Ни одна из функций на самом деле не экспортируется (проверено с помощью declare -F). Однако, если я поставлю echo "$function" в цикл, он печатает все имена функций, так что я знаю, что единственная часть цикла не работает, это export линия.

Функции экспортируются должным образом, если я использую export -f в сеансе SSH, или если я добавлю export -f строка для каждой отдельной функции в файле.

Я использую 14.04 с Bash 4.3.11, а SSH клиентом является Termux на Android.

Редактировать: даже если я добавлю declare -F на дне ~/.bash_functions, функции показывают как не экспортируемые.

Редактировать: я только что понял, что в локальном сеансе некоторые из моих функций не экспортируются, по-видимому, наугад, но я не могу найти никаких доказательств ошибки. Я делаю больше исследований...

1 ответ

Решение

Поскольку while цикл находится в конвейере, он выполняется в подоболочке. Если вы выйдете и войдете в систему, вы увидите, что локальный сеанс также будет затронут (не только SSH). Это можно исправить, переместив список в переменную и переключившись на for цикл:

# Find functions in this script based on a grep search, and export them.
functions="$( grep ^'[[:alnum:]]' ~/.bash_functions |
  grep '()' |
  cut -d'(' -f1 
)"

for function in $functions; do
  export -f "$function"
done
unset -v function functions # Also I added the -v flag to make this only unset variables.
Другие вопросы по тегам