89 votes

Exporter une fonction en shell

Dites-moi comment exporter une fonction dans le shell parent (bash, sh ou ksh) afin que la fonction soit disponible pour tous les processus enfants lancés à partir du processus parent?

111voto

Dennis Williamson Points 105818

La fonctionnalité export -f est spécifique à Bash:

parent

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

enfant

 #!/bin/bash
echo $(plus1 $(($1 * $2)) )
 

3voto

Si vous utilisez ksh ou zsh:

Vous pouvez utiliser la variable d'environnement FPATH, dans lequel vous pouvez placer toutes vos fonctions.

Si FPATH est interactif interprète, et une commande ou une fonction n'est pas trouvé dans le courant de l'environnement de shell ou le CHEMIN d'accès, les répertoires il y a recherché l'existence d'un fichier nommé d'après le manque de commande. Si l'on se trouve, il est pris dans le courant de l'environnement de shell, et on s'attend à définir la fonction.

Ainsi, vous pouvez placer toutes vos fonctions dans un emplacement dans le FPATH. et de l'enfant scripts seront également en mesure de le trouver.

Vous pouvez utiliser de chargement automatique de commande dans le shell scripts à charger les fonctions dont vous avez besoin:

autoload fun_a fun_b

En zsh, autoload est nécessaire pour FPATH de travail. En ksh et de ses proches, je crois que c'simplement causes des fonctions définies dans le FPATH pour remplacer régulièrement commande dans votre CHEMIN d'accès, comme ils le feraient si elles sont définies directement.

Quelques détails sur FPATH et autoload:

1voto

DigitalRoss Points 80400

Si vous créez des sous-coquille avec ( ) alors qu'ils héritent d'une capture instantanée de toutes les définitions, les paramètres et les variables shell.

Si vous exécuter de programmes de ce genre, alors vous pouvez mettre les définitions en .bashrc.

Si vous êtes tentent d'usurper l'identité d'un script existant dans l'exécution d'un emballage ou la substitution d'un CHEMIN d'accès à la commande, puis .bashrc fonctionnera selon les détails de l'exécution. Si non, vous pouvez exécuter un script qui ne fonctionne tout simplement un . ou source d'un fichier include qui définit les fonctions et fait ensuite la même chose avec le shell script avec les commandes à être remplacé.

Le script devrait ressembler à quelque chose comme:

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X