Sobre la base de la respuesta de @ Lekensteyn ...
Si lo usa declare -pf
, enviará todas las funciones definidas previamente en el shell actual a STDOUT.
En ese momento, puede redirigir STDOUT a donde quiera y, de hecho, rellenar las funciones definidas previamente donde quiera.
La siguiente respuesta los convertirá en una variable. Luego, hacemos eco de esa variable más la invocación de la función que queremos ejecutar en el nuevo shell que se genera como un nuevo usuario. Hacemos esto mediante el uso sudo
del -u
modificador (también conocido como user
) y simplemente ejecutando Bash (que recibirá el STDOUT canalizado como entrada para ejecutar).
Como sabemos que vamos de un shell Bash a un shell Bash, sabemos que Bash interpretará correctamente las funciones definidas de shells anteriores. La sintaxis debe estar bien siempre que nos traslademos entre un shell Bash de la misma versión a un nuevo shell Bash de la misma versión.
YMMV si se está moviendo entre diferentes shells o entre sistemas que pueden tener diferentes versiones de 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
a#!/bin/bash
y despuésdoit() {...}
soloexport -f doit