web-dev-qa-db-fra.com

source vs export vs export LD_LIBRARY_PATH

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?

1
ankit7540

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_.

5
ridgy