GNU/Linux >> Tutoriels Linux >  >> Linux

La différence d'utilisation entre les variables shell et les variables d'environnement ?

En fait, je ne savais pas qu'il existe deux types de variables différents auxquels je peux accéder à partir de la ligne de commande. Tout ce que je savais, c'est que je pouvais déclarer des variables comme :

foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"

ou y accéder avec un signe $, comme :

echo $foo
echo ${bar[1]}

ou en utilisant des variables intégrées, comme :

echo $PWD
PATH=$PATH:"/usr/bin/myProg"

Maintenant, j'entends qu'il y a deux (au moins ?) types de variables :les variables shell et les variables d'environnement.

  • Quel est l'intérêt d'avoir deux types différents ?
  • Comment savoir de quel type est une variable ?
  • Quelles sont les utilisations typiques de chacun ?

Réponse acceptée :

Les variables d'environnement sont une liste de name=value des paires qui existent quel que soit le programme (shell, application, démon…). Ils sont généralement hérités par les processus enfants (créés par un fork /exec séquence) :les processus enfants reçoivent leur propre copie des variables parentes.

Les variables shell n'existent que dans le contexte d'un shell. Ils ne sont hérités que dans les sous-shells (c'est-à-dire lorsque le shell est forké sans un exec opération). Selon les fonctionnalités du shell, les variables peuvent être non seulement de simples chaînes comme celles de l'environnement, mais aussi des tableaux, des composés, des variables typées comme des entiers ou des virgules flottantes, etc.

Lorsqu'un shell démarre, toutes les variables d'environnement dont il hérite de son parent deviennent également des variables shell (à moins qu'elles ne soient invalides en tant que variables shell et autres cas extrêmes comme IFS qui est réinitialisé par certains shells) mais ces variables héritées sont marquées comme exportées. Cela signifie qu'ils resteront disponibles pour les processus enfants avec la valeur potentiellement mise à jour définie par le shell. C'est également le cas des variables créées sous le shell et étiquetées comme exportées avec le export mot-clé.

Les tableaux et autres variables de type complexe ne peuvent pas être exportés à moins que leur nom et leur valeur puissent être convertis en name=value motif, ou lorsqu'un mécanisme spécifique au shell est en place (par exemple :bash exporte des fonctions dans l'environnement et certains shells exotiques non POSIX comme rc et es peut exporter des tableaux).

Ainsi, la principale différence entre les variables d'environnement et les variables shell est leur portée :les variables d'environnement sont globales tandis que les variables shell non exportées sont locales au script.

Notez également que les shells modernes (au moins ksh et bash ) prennent en charge une troisième portée de variables shell. Variables créées dans les fonctions avec le typeset mot-clé sont locaux à cette fonction (la façon dont la fonction est déclarée active/désactive cette fonctionnalité sous ksh , et le comportement de persistance est différent entre bash et ksh ). Voir https://unix.stackexchange.com/a/28349/2594

En relation:Différence entre "reg save" et "reg export" ?

Cela s'applique aux shells modernes comme ksh , dash , bash et similaire. L'ancien shell Bourne et les shells de syntaxe non Bourne comme csh ont des comportements différents.


Linux
  1. Quelle est la différence entre Sudo Su - et Sudo Su - ?

  2. La différence entre Getty et Agetty ?

  3. La Différence Entre Nss Et Pam?

  4. Quelle est la différence entre env et set (sur Mac OS X ou Linux) ?

  5. Quelle est la différence entre unlink et rm ?

Quelle est la différence entre InnoDB et MyISAM ?

Quelle est la différence entre Linux et Unix ?

Quelle est la différence entre la connexion et le shell sans connexion

Quelle est la différence entre une console, un terminal et un shell ?

Différence entre '{}' et {} dans la commande find ?

Quelle est la différence entre ls et l ?