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 -ffunció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 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.
Algunos detalles sobre FPATHy 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, .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=$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 . ( kshLa contraparte de declare, typesettiene una -xopción, pero solo se aplica a variables , no a funciones; lo mismo ocurre con zsh).