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.