Exporter une fonction dans shell

s'il vous Plaît dites-moi comment faire pour exporter une fonction de parent shell (bash, sh ou ksh), de sorte que la fonction sera disponible pour tous le processus de l'enfant launced du processus parent?

78
demandé sur Steven Penny 2009-12-11 07:58:38

6 réponses

la caractéristique export -f est propre à Bash:

parent

#!/bin/bash
plus1 () { echo $(( + 1)); }
echo $(plus1 8)
export -f plus1
./child 14 21

enfant

#!/bin/bash
echo $(plus1 $(( * )) )
93
répondu Dennis Williamson 2009-12-11 07:22:32

Dans sh , il est pas possible d'exporter une fonction, comme noté par Charles Duffy .

5
répondu anol 2017-05-23 12:10:43

si vous utilisez ksh ou zsh:

vous pouvez utiliser la variable d'environnement FPATH , où vous pouvez placer toutes vos fonctions.

si FPATH est défini sur un interpréteur interactif, et qu'une commande ou une fonction ne se trouve pas dans l'environnement shell actuel ou PATH , les répertoires qui y sont listés sont recherchés pour l'existence d'un fichier nommé d'après la commande manquante. Si il en trouve, il est fourni dans l'environnement shell actuel, et devrait définir la fonction.

ainsi, vous pouvez placer toutes vos fonctions dans un emplacement dans FPATH , et les scripts pour enfants seront également en mesure de le trouver.

vous pouvez utiliser la commande autoload dans les scripts shell pour charger les fonctions dont vous avez besoin:

autoload fun_a fun_b

Dans zsh, autoload est nécessaire pour FPATH au travail. Dans ksh et ses proches parents, je crois qu'il provoque simplement les fonctions définies dans FPATH pour outrepasser la commande régulière dans votre chemin, comme ils le feraient si elles étaient définies directement.

Quelques détails sur FPATH et autoload :

3
répondu Venkataramesh Kommoju 2014-11-09 23:21:06

si vous créez des sous-couches avec ( ) alors elles hériteront d'un instantané de toutes les définitions, paramètres et variables shell.

si vous les exécutez comme des programmes, vous pouvez mettre les définitions dans .bashrc .

si vous essayez de mystifier un script existant en exécutant un wrapper ou une commande de substitution de chemin, alors .bashrc fonctionnera en fonction des détails de l'exécution. Si non, vous pouvez exécuter une script d'enrubannage qui fait simplement . ou source d'un fichier include qui définit les fonctions et fait la même chose avec le script shell avec les commandes à remplacer.

Le script devrait ressembler à quelque chose comme:

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

l'idée est que le premier paramètre est le nom du script réel et les paramètres restants sont les args, puis le script ci-dessus est exécuté à la place.

1
répondu DigitalRoss 2009-12-11 05:31:34
declare -x -f NAME

plus d'information

-f        restrict action or display to function names and definitions
-x        to make NAMEs export
1
répondu Steven Penny 2014-11-04 19:30:01

fonctions ne sont pas exportables par nature. Cependant vous pouvez exporter des cordes, donc j'ai un petit truc ici:

func="$(typeset -f funcname)"
export func

pour importer la fonction, la redéfinir à partir de la chaîne exportée:

# in subshell
eval "$func"
0
répondu iBug 2017-12-14 15:25:37