Lors de la compilation d'applications à partir de code source à l'aide de make
ou cmake
, les instructions disent généralement:
source <some path> <parameter>
export <some text>
De plus, beaucoup de temps LD_LIBRARY_PATH
apparaît, utilisé avec export
.
Quelle est la différence entre source
et export
? Pourquoi avons-nous besoin d'eux?
Les commandes Shell source
et export
sont vraiment différentes. En bref:
source
Lorsque vous appelez un script shell normalement (par exemple avec _./myscript.sh
_ ou _sh myscript.sh
_), il sera exécuté dans son propre contexte de processus (un nouvel environnement de processus). Ainsi, toutes les variables définies dans le script ne seront pas exécutées. être disponible dans le shell appelant. Lors de l'exécution d'un script à l'aide de la commande source
, il sera exécuté dans le contexte du script d'appel. De cette façon, vous pouvez définir des variables d'environnement en appelant _source myscript
_.
export
Les variables d'environnement ne sont généralement valides que dans le contexte (local) du processus en cours. Ainsi, si vous exécutez quelque chose (script ou programme) qui demande un nouvel environnement de processus, l'environnement local ne sera pas visible dans le nouveau processus. Pour transmettre des valeurs d'environnement à un processus enfant, vous devez les "exporter" en faisant précéder l'affectation par export
, par exemple. _export VAR=value
_.
export LD_LIBRARY_PATH
La variable d'environnement spéciale _LD_LIBRARY_PATH
_ définit le chemin dans lequel les bibliothèques chargeables sont recherchées (similaire à la variable PATH
, qui définit où rechercher les exécutables). Par défaut, les bibliothèques sont recherchées dans _/lib
_, _/usr/lib
_ et similaires. Les bibliothèques installées dans des répertoires non standard (par exemple, _/opt/program/lib
_) ne peuvent être chargées que lorsque ces chemins sont également définis par _export LD_LIBRARY_PATH=/opt/program/lib
_ dans cet exemple. Vous devez exporter ici, car cela doit être connu du nouvel environnement de processus dans lequel votre programme est exécuté.
persistance
L'environnement de processus existe tant que le processus est en cours d'exécution. Cela est également vrai pour les variables d'environnement (si non explicitement défini). Si le processus est tué (par exemple en fermant la fenêtre du terminal), tous les sous-processus seront également tués et l'environnement ou les environnements seront supprimés. Plus précisément, cela dépend de la réaction du processus enfant sur SIGHUP
. Si ce n'est pas le cas, il fonctionnera plus tard en tant qu'enfant du processus utilisateur (par exemple, _/sbin/upstart --user
_) ou du processus init (PID = 1).
Pour résoudre le problème de la suppression du processus parent, les sous-processus peuvent être libérés du processus parent en utilisant la commande Nohup
(voir _man Nohup
_), qui ne transmettra pas SIGHUP
à l'enfant et en libérant le processus à l'arrière-plan:
_Nohup <progname> &
_
détache le processus du processus parent, attribue STDIN à _/dev/null
_ et STDOUT à _./Nohup.out
_.