Pour qu’une fonction puisse être exécutée par un programme shell différent de celui où elle a été définie, il est nécessaire d’exporter cette fonction. On utilise la commande interne export.
Syntaxe : export -f nomfct ...
Pour que l’export fonctionne, le sous-shell qui exécute la fonction doit avoir une relation de descendance avec le programme shell qui exporte la fonction.
Le programme shell progBonj définit et utilise une fonction bonj. Ce script lance l’exécution d’un programme shell autreProgShell qui utilise également la fonction bonj (mais qui ne la définit pas) ; autreProgShell étant exécuté dans un environnement différent de progBonj, il ne pourra trouver la définition de la fonction bonj : une erreur d’exécution se produit.
#!/bin/bash # @(#) progBonj function bonj { echo bonj : Bonjour $1 } bonj Madame autreProgShell
#!/bin/bash # @(#) autreProgShell echo appel a la fonction externe : bonj bonj Monsieur
$ progBonj bonj : Bonjour Madame appel a la fonction externe : bonj ./autreProgShell: line 5: bonj : commande introuvable $
Pour que la fonction bonj puisse être exécutée par autreProgShell, il suffit que le programme shell qui la contient exporte sa définition.
#!/bin/bash # @(#) progBonjExport function bonj { echo bonj : Bonjour $1 } export -f bonj # la fonction bonj est exportee bonj Madame autreProgShell
Après son export, la fonction bonj sera connue dans les sous-shells créés lors de l’exécution de progBonjExport.
$ progBonjExport bonj : Bonjour Madame appel a la fonction externe : bonj bonj : Bonjour Monsieur => affiché lors de l’exécution de autreProgShell $
La visibilité d’une fonction exportée est similaire à celle d’une variable locale, c'est-à-dire une visibilité arborescente dont la racine est le point d’export de la fonction.
Le programme shell progBonjExport2Niv définit et exporte la fonction bonj. Après avoir utilisée la fonction bonj (bonj Madame), il exécute le programme autreProg1.
#!/bin/bash # @(#) progBonjExport2Niv function bonj { echo bonj : Bonjour $1 } export -f bonj bonj Madame autreProg1
Le programme autreProg1 utilise la fonction bonj (bonj Monsieur) puis exécute le programme autreProg2.
#!/bin/bash # @(#) autreProg1 echo "$0 : appel a la fonction externe : bonj" bonj Monsieur autreProg2
Le programme autreProg2 utilise la fonction bonj (bonj Mademoiselle) puis se termine.
#!/bin/bash # @(#) autreProg2 echo "$0 : appel a la fonction externe : bonj" bonj Mademoiselle
$ progBonjExport2Niv bonj : Bonjour Madame ./autreProg1 : appel a la fonction externe : bonj bonj : Bonjour Monsieur ./autreProg2 : appel a la fonction externe : bonj bonj : Bonjour Mademoiselle $