"lancer un script" vs "sourcer un script"

Fermé
Lamy - 10 nov. 2010 à 10:18
 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.

A voir également:

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
10 nov. 2010 à 11:25
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 ;-\

1
merci c'est clair.
0
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 ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
10 nov. 2010 à 11:48
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
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 422
10 nov. 2010 à 18:21
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" ;-\
0