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 -f
función es específica de Bash:padre
#!/bin/bash plus1 () { echo $(($1 + 1)); } echo $(plus1 8) export -f plus1 ./child 14 21
niñ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
FPATH
está 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
autoload
comando en scripts de shell para cargar las funciones que necesita:autoload fun_a fun_b
En zsh,
autoload
es necesario paraFPATH
que funcione. Enksh
y 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.Algunos detalles sobre
FPATH
yautoload
: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,
.bashrc
funcionará dependiendo de los detalles de la ejecución. Si no es así, podría ejecutar un script de envoltura que simplemente haga una.
osource
de 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 NAME
Más información
fuente
bash
. (ksh
La contraparte dedeclare
,typeset
tiene una-x
opció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 func
Para importar la función, vuelva a definirla desde la cadena exportada:
# in subshell eval "$func"
fuente