Admito que não há uma maneira simples e intuitiva de fazer isso, e isso é um pouco hacky. Mas você pode fazer assim:
function hello()
{
echo "Hello!"
}
# Test that it works.
hello
FUNC=$(declare -f hello)
sudo bash -c "$FUNC; hello"
Ou mais simplesmente:
sudo bash -c "$(declare -f hello); hello"
Funciona para mim:
$ bash --version
GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
$ hello
Hello!
$
$ FUNC=$(declare -f hello)
$ sudo bash -c "$FUNC; hello"
Hello!
Basicamente, declare -f
retornará o conteúdo da função, que você passa para bash -c
inline.
Se você quiser exportar todas as funções da instância externa do bash, altere FUNC=$(declare -f hello)
para FUNC=$(declare -f)
.
Editar
Para abordar os comentários sobre citações, consulte este exemplo:
$ hello()
> {
> echo "This 'is a' test."
> }
$ declare -f hello
hello ()
{
echo "This 'is a' test."
}
$ FUNC=$(declare -f hello)
$ sudo bash -c "$FUNC; hello"
Password:
This 'is a' test.