Parece que você precisa export
da definição dessa função primeiro:
#!/bin/bash
user_func (){
whoami
exit
}
export -f user_func
su vagrant -c 'user_func'
deve fazer o truque.
O -f
informa export
que este é um nome de função em vez de um nome de variável. Citando de help export
:
Marks each NAME for automatic export to the environment of subsequently executed commands. ....
Options:
-f refer to shell functions
Como apontado por Peter e Stephane nos comentários, isso pressupõe duas coisas:
- Que o comando
su
não substituirá o ambiente do usuário -
Esse shell de login do
vagrant
ébash
. Caso contrário, você pode usar a linha de comando alternativasu
fornecida por Stephane:su vagrant -c 'bash -c user_func'