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?
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 $(( * )) )
Dans sh
, il est pas possible d'exporter une fonction, comme noté par Charles Duffy .
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
:
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.
declare -x -f NAME
plus d'information
-f restrict action or display to function names and definitions -x to make NAMEs export
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"