Опираясь на ответ @ Лекенштейна ...
Если вы используете declare -pfего, выведите все ранее определенные функции в текущей оболочке в STDOUT.
В этот момент вы можете перенаправить STDOUT туда, куда вам нужно, и, по сути, заполнить ранее определенные функции, куда вы хотите.
Следующий ответ поместит их в переменную. Затем мы повторяем эту переменную плюс вызов функции, которую мы хотим запустить в новую оболочку, которая создается как новый пользователь. Мы делаем это, используя sudoс -u(ака. user) Переключатель и просто запустив Bash (который получит водопроводную STDOUT в качестве входных данных для запуска).
Поскольку мы знаем, что мы идем от оболочки Bash к оболочке Bash, мы знаем, что Bash будет правильно интерпретировать функции, определенные предыдущими оболочками. Синтаксис должен быть в порядке, пока мы перемещаемся между одной оболочкой Bash той же версии и новой оболочкой Bash той же версии.
YMMV, если вы перемещаетесь между разными оболочками или между системами, которые могут иметь разные версии Bash.
#!/bin/bash
foo() {
echo "hello from `whoami`"
}
FUNCTIONS=`declare -pf`; echo "$FUNCTIONS ; foo" | sudo -u otheruser bash
# $./test.sh
# hello from otheruser
#!/bin/shк#!/bin/bashи послеdoit() {...}того, как толькоexport -f doit