Exportar una función en shell

87

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.

Sachin Chourasiya
fuente
1
unix.stackexchange.com/questions/22796/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

105

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)) )
Pausado hasta nuevo aviso.
fuente
2
¿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).
Pausado hasta nuevo aviso.
3

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:

Venkataramesh Kommoju
fuente
1

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.

DigitalRoss
fuente
2
¿Podría explicar esto con un ejemplo de codificación? No quiero poner mi función en .bashrc
Sachin Chourasiya
1
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
Steven Penny
fuente
6
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:

# in subshell
eval "$func"
iBug
fuente