Спираючись на відповідь @ Лекенштейна ...
Якщо ви користуєтесь 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