Exportar una función en el shell


Por favor dígame cómo exportar una función en el shell padre (bash, sh o ksh) para que la función esté disponible para todo el proceso hijo lanzado desde el proceso padre?

Author: Steven Penny, 2009-12-11

6 answers

La característica export -f 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)) )
 93
Author: Dennis Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-11 07:22:32

En sh es no posible exportar una función, como señaló Charles Duffy.

 5
Author: anol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:43

Si está usando ksh o zsh:

Puede usar la variable de entorno FPATH, donde puede colocar todas sus funciones.

Si FPATH se establece en un intérprete interactivo, y un comando o función no se encuentra en el entorno de shell actual o en el PATH, se busca en los directorios listados la existencia de un archivo con el nombre del comando faltante. Si se encuentra uno, se obtiene en el entorno de shell actual, y se espera que defina el función.

Por lo tanto, puede colocar todas sus funciones en una ubicación en FPATH, y los scripts hijos también podrán encontrarla.

Puede usar el comando autoload en los scripts de shell para cargar las funciones que necesita:

autoload fun_a fun_b

En zsh, autoload es necesario para que FPATH funcione. En ksh y sus parientes cercanos, creo que simplemente hace que las funciones definidas en FPATH anulen el comando regular en su CAMINO, como lo harían si se definieran directamente.

Algunos detalles sobre FPATH y autoload:

 3
Author: Venkataramesh Kommoju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-09 23:21:06

Si crea subcells con ( ) entonces 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 suplantar un script existente para ejecutar un wrapper o sustituir un comando PATH, entonces .bashrc funcionará dependiendo de los detalles de la ejecución. Si no, podría ejecutar un script de envoltura que simplemente haga un . o source de una inclusión fichero que define las funciones y luego hace lo mismo con el script de shell con los comandos a sustituir.

El script de envoltura podría tener un aspecto similar a:

script=$1
shift
. include.sh
. $script "$@"

La idea es que el primer parámetro es el nombre del script real y los parámetros restantes son los args, luego se ejecuta el script anterior en su lugar.

 1
Author: DigitalRoss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-11 05:31:34
declare -x -f NAME

Más información

-f        restrict action or display to function names and definitions
-x        to make NAMEs export
 1
Author: Steven Penny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-04 19:30:01

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 a partir de la cadena exportada:

# in subshell
eval "$func"
 0
Author: iBug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-14 15:25:37