Com base na resposta de @ Lekensteyn ...
Se você usá- declare -pf
lo, exibirá todas as funções definidas anteriormente no shell atual para STDOUT.
Nesse ponto, você pode redirecionar o STDOUT para onde quiser e, com efeito, colocar as funções definidas anteriormente onde quiser.
A resposta a seguir os colocará em uma variável. Em seguida, repetimos essa variável mais a invocação da função que queremos executar no novo shell que é gerado como um novo usuário. Fazemos isso usando sudo
o comutador -u
(aka. user
) E simplesmente executando o Bash (que receberá o STDOUT canalizado como a entrada a ser executada).
Como sabemos que estamos passando de um shell Bash para um shell Bash, sabemos que o Bash interpretará corretamente as funções definidas pelos shells anteriores. A sintaxe deve estar correta desde que nos movamos entre um shell Bash da mesma versão para um novo shell Bash da mesma versão.
YMMV se você estiver se deslocando entre diferentes shells ou entre sistemas que podem ter versões diferentes do 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
para#!/bin/bash
e depoisdoit() {...}
apenasexport -f doit