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?
Réponses
Trop de publicités?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:
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.