14.9. Exporter une fonction

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
$