"lancer un script" vs "sourcer un script" [Fermé]

- - Dernière réponse :  jklm - 8 août 2019 à 15:15
Bonjour,
Je me pose la question de la différence entre "lancer" un script et "sourcer" un script :
c'est à dire, par exemple, pour un script (exécutable par "user") action.ksh, la différence entre :
user$action.ksh et
user$. action.ksh
Mon script en question fait une surcharge de variables d'environnement par une série de "export" : par exemple export VERSION_ORACLE="10.2.0.4"
ce script est ensuite appellé par de nombreux scripts or il fonctionne en le "sourçant" (. action.ksh) mais pas en l'appelant (action.ksh), pourquoi ? Quelle est la différence ?
J'ai aussi remarqué que lorsque le script qui l'appelle est lui-même "sourcé" par un script appelant (toto.ksh contient la ligne ". titi.ksh", et titi.ksh contient la ligne ". action.ksh") l'exécution est brutalement stoppée sans aucun message d'erreur.
Quelqu'un peut-il m'initier à ces subtilités ?
Merci.

Afficher la suite 

3 réponses

Meilleure réponse
Messages postés
36788
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
25 août 2019
3895
1
Merci
Salut,

Quand tu lances un script par :

./mon_script.sh
ou (si le répertoire contenant le script est dans la variable $PATH)
mon_script.sh

Le script est lancé dans un sous shell (appelé communément shell fils), dont les seules variables reconnues seront celles définies à l'intérieur du script, d'où l'intérêt de sourcer un fichier contenant des variables que l'on veut inclure dans notre nouvel environnement.

Quand tu lances un script en le sourçant :

. le_script

En fait tu le lances en restant dans l'environnement du shell initial (shell père) sans créer de nouveau processus. Tout changement apporté à une variable sera répercuté dans l'environnement du shell courant (shell père). De même une commande comme "exit" dans le fichier "sourcé" aura des répercussions sur le shell où tu te trouves et devrait mettre fin à son processus en quittant le shell ;-\

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 59148 internautes nous ont dit merci ce mois-ci

0
Merci
Merci, c'est clair.
Pourquoi alors : (pour reprendre mon exemple toto>titi>action)
Quand "titi" source "action" : ça marche, sauf arrtêt brutal quand j'ajoute ces lignes dans "action" :

export VERSION_ORACLE="10.2.0.4"
export ORACLE_HOME=$ORACLE_BASE/${VERSION_ORACLE}
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export PATH=/bin:/usr/bin:/etc:/usr/lbin:/usr/ccs/bin:/usr/bin/X11:/usr/local/bin:/apps/oracle/10.2.0.4/bin:/apps/safewatch:/home/mqm
/SHINE:/usr/java14/jre/bin::/apps/cft/filexe:/apps/cft/filusr:/apps/cft/filexit:/apps/cft/filapi:/usr/bin:/etc:/usr/sbin:/usr/ucb:/us
r/bin/X11:/sbin:/usr/lpp/mqm/bin:/usr/lpp/mqm/samp/bin:.:/apps/safewatch/current/outils/cmd:/apps/safewatch/current/outils/bin:/apps/
safewatch/current/adm/cmd:/usr/mqm/samp/bin:/apps/cft/filexe:/apps/cft/filusr:/apps/cft/filexit:/apps/cft/filapi:/apps/cft/ifcft
export LIBPATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$ORACLE_HOME/lib32:$ORACLE_HOME/precomp/public
export TNS_ADMIN=$ORACLE_BASE/adm/network

Alors que quand "titi" lance "action" (même avec les lignes) sans le sourcer, ça marche (sauf que les variables ne sont pas définies globalement, évidemment).
Y a-t-il dans les lignes ajoutées quelque chose de spécial qui le fasse planter ?
zipe31
Messages postés
36788
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
25 août 2019
3895 -
Dans ton exemple export PATH et export LD_LIBRARY_PATH les chemins ont l'air tronqué (retour à la ligne), est-ce le cas dans ton script ?
0
Merci
Non : c'est pas tronqué, c'est l'éditeur du forum qui fait ça.
En fait mon "action.ksh" fonctionne parfaitement quand il est appellé de façon plus directe.
zipe31
Messages postés
36788
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
25 août 2019
3895 -
Essaies de rendre ton script plus verbeux (ajout de set -xv après ton shebang) afin d'essayer de voir comment sont interprétées les variables ;-\

Sinon, je ne vois aucune définition de la variable "$ORACLE_BASE" ;-\