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.
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.
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)) )
En sh
, es no posible exportar una función, como se ha señalado por Charles Duffy .
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 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 autoload
comando en scripts de shell para cargar las funciones que necesita:
autoload fun_a fun_b
En zsh, autoload
es necesario para FPATH
que funcione. En ksh
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
y autoload
:
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 .
o source
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.
declare -x -f NAME
Más información
-f restringe la acción o visualización a los nombres y definiciones de funciones -x para hacer exportar NAME
bash
. ( ksh
La contraparte de declare
, typeset
tiene una -x
opción, pero solo se aplica a variables , no a funciones; lo mismo ocurre con zsh
).