Veuillez me dire comment exporter une fonction dans le shell parent (bash, sh ou ksh) afin que la fonction soit disponible pour tout le processus enfant lancé à partir du processus parent?
la fonction exportée est-elle disponible uniquement pour les appels enfants? Comment l'appliquer à la session bash actuelle? aime l'écriture .bashrc, mais seulement pour l'instance bash actuelle ...
vp_arth
3
@vp_arth: Si vous n'avez pas besoin de la fonction dans les appels enfants, vous n'avez pas besoin de l'exporter. Il est disponible dans la session en cours de toute façon (notez que s'il est défini dans un fichier, vous devrez rechercher le fichier plutôt que de l'exécuter pour le rendre disponible dans la session en cours).
Suspendu jusqu'à nouvel ordre.
8
Dans sh, il n'est pas possible d'exporter une fonction, comme l'a noté Charles Duffy .
Vous pouvez utiliser la variable d'environnement FPATH, dans laquelle vous pouvez placer toutes vos fonctions.
Si FPATHest défini sur un interpréteur interactif et qu'aucune commande ou fonction n'est trouvée dans l'environnement shell actuel ou dans PATH, les répertoires qui y sont répertoriés sont recherchés pour l'existence d'un fichier nommé d'après la commande manquante. S'il en trouve un, il provient de 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 enfants pourront également le trouver.
Vous pouvez utiliser la autoloadcommande dans les scripts shell pour charger les fonctions dont vous avez besoin:
autoload fun_a fun_b
Dans zsh, autoloadest nécessaire pour FPATHtravailler. Dans kshet ses proches parents, je crois que cela fait simplement que les fonctions définies dans FPATHécrasent la commande régulière dans votre PATH, comme elles le feraient si elles étaient définies directement.
Si vous créez des sous-interpréteurs avec, ( )ils hériteront d'un instantané de toutes les définitions, paramètres et variables du shell.
Si vous les exécutez comme des programmes, vous pouvez insérer les définitions .bashrc.
Si vous essayez d'usurper un script existant pour exécuter un wrapper ou une substitution pour une commande PATH, .bashrccela fonctionnera en fonction des détails de l'exécution. Sinon, vous pouvez à la place exécuter un script wrapper qui fait simplement un .ou sourced'un fichier d'inclusion qui définit les fonctions, puis fait la même chose avec le script shell avec les commandes à remplacer.
Le script wrapper pourrait 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 les paramètres restants sont les arguments, puis le script ci-dessus est exécuté à la place.
Veuillez noter que ceci est spécifique àbash . ( kshHomologue de » à declare, typeset, a une -xoption, mais il applique uniquement aux des variables , des fonctions non; idem pour zsh).
mklement0
0
Les fonctions ne sont pas exportables par nature. Cependant, vous pouvez exporter des chaînes, j'ai donc une petite astuce ici:
func="$(typeset -f funcname)"
export func
Pour importer la fonction, redéfinissez-la à partir de la chaîne exportée:
Réponses:
La
export -f
fonctionnalité est spécifique à Bash:parent
enfant
la source
Dans
sh
, il n'est pas possible d'exporter une fonction, comme l'a noté Charles Duffy .la source
Si vous utilisez ksh ou zsh:
Vous pouvez utiliser la variable d'environnement
FPATH
, dans laquelle vous pouvez placer toutes vos fonctions.Si
FPATH
est défini sur un interpréteur interactif et qu'aucune commande ou fonction n'est trouvée dans l'environnement shell actuel ou dansPATH
, les répertoires qui y sont répertoriés sont recherchés pour l'existence d'un fichier nommé d'après la commande manquante. S'il en trouve un, il provient de 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 enfants pourront également le trouver.Vous pouvez utiliser la
autoload
commande dans les scripts shell pour charger les fonctions dont vous avez besoin:Dans zsh,
autoload
est nécessaire pourFPATH
travailler. Dansksh
et ses proches parents, je crois que cela fait simplement que les fonctions définies dansFPATH
écrasent la commande régulière dans votre PATH, comme elles le feraient si elles étaient définies directement.Quelques détails sur
FPATH
etautoload
:la source
Si vous créez des sous-interpréteurs avec,
( )
ils hériteront d'un instantané de toutes les définitions, paramètres et variables du shell.Si vous les exécutez comme des programmes, vous pouvez insérer les définitions
.bashrc
.Si vous essayez d'usurper un script existant pour exécuter un wrapper ou une substitution pour une commande PATH,
.bashrc
cela fonctionnera en fonction des détails de l'exécution. Sinon, vous pouvez à la place exécuter un script wrapper qui fait simplement un.
ousource
d'un fichier d'inclusion qui définit les fonctions, puis fait la même chose avec le script shell avec les commandes à remplacer.Le script wrapper pourrait ressembler à quelque chose comme:
L'idée est que le premier paramètre est le nom du script réel et les paramètres restants sont les arguments, puis le script ci-dessus est exécuté à la place.
la source
Plus d'informations
la source
bash
. (ksh
Homologue de » àdeclare
,typeset
, a une-x
option, mais il applique uniquement aux des variables , des fonctions non; idem pourzsh
).Les fonctions ne sont pas exportables par nature. Cependant, vous pouvez exporter des chaînes, j'ai donc une petite astuce ici:
Pour importer la fonction, redéfinissez-la à partir de la chaîne exportée:
la source