Por favor, dígame cómo exportar una función en el shell principal (bash, sh o ksh) para que la función esté disponible para todos los procesos secundarios iniciados desde el proceso principal.
¿La función exportada está disponible solo para llamadas de niños? ¿Cómo aplicarlo a la sesión actual de bash? me gusta escribir .bashrc, pero solo para la instancia actual de bash ...
vp_arth
3
@vp_arth: si no necesita la función en llamadas secundarias, no necesita exportarla. Está disponible en la sesión actual de cualquier manera (tenga en cuenta que si está definido en un archivo, deberá obtener el archivo en lugar de ejecutarlo para que esté disponible en la sesión actual).
Puedes usar la variable de entorno FPATH , en la que puede colocar todas sus funciones.
Si FPATHestá configurado en un intérprete interactivo y no se encuentra un comando o función en el entorno de shell actual o en el PATH, se buscará en los directorios enumerados allí la existencia de un archivo con el nombre del comando que falta. Si se encuentra uno, se obtiene en el entorno de shell actual y se espera que defina la función.
Por lo tanto, puede colocar todas sus funciones en una ubicación en FPATH , y los scripts secundarios también podrán encontrarlo.
Puede utilizar el autoloadcomando en scripts de shell para cargar las funciones que necesita:
autoload fun_a fun_b
En zsh, autoloades necesario para FPATHque funcione. En kshy sus parientes cercanos, creo que simplemente causa funciones definidas enFPATH anulen el comando regular en su RUTA, como lo harían si se definieran directamente.
Si crea subcapas con ( ), heredarán una instantánea de todas las definiciones, parámetros y variables de shell.
Si los ejecuta como programas, puede poner las definiciones en .bashrc .
Si está intentando falsificar un script existente para ejecutar un contenedor o sustitución de un comando PATH, .bashrcfuncionará dependiendo de los detalles de la ejecución. Si no es así, podría ejecutar un script de envoltura que simplemente haga una .o sourcede un archivo de inclusión que define las funciones y luego haga lo mismo con el script de shell con los comandos que se van a sustituir.
La secuencia de comandos de envoltura podría verse así:
script=$1shift
. include.sh
. $script"$@"
La idea es que el primer parámetro sea el nombre del script real y los parámetros restantes sean los argumentos, luego se ejecuta el script anterior.
Tenga en cuenta que esto es específico debash . ( kshLa contraparte de declare, typesettiene una -xopción, pero solo se aplica a variables , no a funciones; lo mismo ocurre con zsh).
mklement0
0
Las funciones no son exportables por naturaleza. Sin embargo, puede exportar cadenas, así que tengo un pequeño truco aquí:
func="$(typeset -f funcname)"export func
Para importar la función, vuelva a definirla desde la cadena exportada:
Respuestas:
La
export -ffunción es específica de Bash:padre
#!/bin/bash plus1 () { echo $(($1 + 1)); } echo $(plus1 8) export -f plus1 ./child 14 21niño
#!/bin/bash echo $(plus1 $(($1 * $2)) )fuente
En
sh, es no posible exportar una función, como se ha señalado por Charles Duffy .fuente
Si está utilizando ksh o zsh:
Puedes usar la variable de entorno
FPATH, en la que puede colocar todas sus funciones.Si
FPATHestá configurado en un intérprete interactivo y no se encuentra un comando o función en el entorno de shell actual o en elPATH, se buscará en los directorios enumerados allí la existencia de un archivo con el nombre del comando que falta. Si se encuentra uno, se obtiene en el entorno de shell actual y se espera que defina la función.Por lo tanto, puede colocar todas sus funciones en una ubicación en
FPATH, y los scripts secundarios también podrán encontrarlo.Puede utilizar el
autoloadcomando en scripts de shell para cargar las funciones que necesita:autoload fun_a fun_bEn zsh,
autoloades necesario paraFPATHque funcione. Enkshy sus parientes cercanos, creo que simplemente causa funciones definidas enFPATHanulen el comando regular en su RUTA, como lo harían si se definieran directamente.Algunos detalles sobre
FPATHyautoload:fuente
Si crea subcapas con
( ), heredarán una instantánea de todas las definiciones, parámetros y variables de shell.Si los ejecuta como programas, puede poner las definiciones en
.bashrc.Si está intentando falsificar un script existente para ejecutar un contenedor o sustitución de un comando PATH,
.bashrcfuncionará dependiendo de los detalles de la ejecución. Si no es así, podría ejecutar un script de envoltura que simplemente haga una.osourcede un archivo de inclusión que define las funciones y luego haga lo mismo con el script de shell con los comandos que se van a sustituir.La secuencia de comandos de envoltura podría verse así:
script=$1 shift . include.sh . $script "$@"La idea es que el primer parámetro sea el nombre del script real y los parámetros restantes sean los argumentos, luego se ejecuta el script anterior.
fuente
declare -x -f NAMEMás información
fuente
bash. (kshLa contraparte dedeclare,typesettiene una-xopción, pero solo se aplica a variables , no a funciones; lo mismo ocurre conzsh).Las funciones no son exportables por naturaleza. Sin embargo, puede exportar cadenas, así que tengo un pequeño truco aquí:
func="$(typeset -f funcname)" export funcPara importar la función, vuelva a definirla desde la cadena exportada:
# in subshell eval "$func"fuente