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