Variable d'environnement vs variable Shell, quelle est la différence?

56

Quelqu'un m'a dit que:

BASH n'est pas une variable d'environnement, c'est une variable shell

Quelle est la différence?

Tom Brito
la source
sonne comme la même chose a juste une portée différente?
Alexander Mills

Réponses:

35

$BASHest une variable locale valide uniquement dans le shell actuel (bash).

Les variables d'environnement telles que $SHELLsont valables à l'échelle du système. Dans un shell Bash actuel, $BASHpointe sur le chemin d'exécution de bash , alors qu'il $SHELLpointe sur le shell défini par défaut (qui peut avoir la même valeur).

Pour une explication des variables d'environnement, voir Aide sur les variables d'environnement dans Ubuntu.

Takkat
la source
1
Un excellent lien (+1) :)
Peter.O
12
Cette réponse est incorrecte / inexacte. Les variables d'environnement ne sont PAS globales / globales. Les variables shell sont privées du shell en cours d'exécution et ne sont PAS exportées (transmises) vers des processus enfants. Les variables d'environnement sont exportées vers tous les processus enfants. "MYVAR = private; export OURVAR = shared; printenv" ne signalera que "OURVAR" car, lorsque le shell exécute la commande printenv, il exporte OURVAR, mais pas MYVAR.
CM
2
+1 au commentaire de CM! Je n'ai jamais entendu la différence expliquer si simplement et avec précision !!! Ce commentaire devrait être la réponse.
Jesse le vagabond du vent
48

Une variable d'environnement est un programme disponible globalement, dans un programme et des programmes enfants. Une variable shell est uniquement disponible dans le shell actuel. Pour rendre une variable shell disponible en tant que variable d'environnement, utilisez export VARNAME(sans dollar $).

Exemples de clarification:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Une autre façon de définir une variable d’environnement:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE
Lekensteyn
la source
Je ne pense pas que c'est correct. exportne définit pas nécessairement une variable d'environnement. stackoverflow.com/questions/7411455/…
Chris Stryczynski
3
@ChrisStryczynski exportdéfinit une variable d'environnement pour les processus enfants. Le message que vous avez lié ne contredit pas cette réponse, pourriez-vous préciser pourquoi vous pensez que c'est faux?
Lekensteyn
exportdéfinir absolument une variable d'environnement
David Tonhofer
9

Il existe une différence. Les variables d'environnement et les variables d'environnement l'expliqueront mieux que je peux, mais en voici un extrait:

Si une modification est apportée à une variable shell, celle-ci doit être explicitement "exportée" vers la variable d'environnement correspondante afin que tout sous-processus fourchu puisse voir la modification. Rappelez-vous que les variables de shell sont locales au shell dans lequel elles ont été définies.

Peter.O
la source
Je commente ma propre réponse .. J'aime beaucoup le lien Aide Ubuntu dans la réponse de Takkat ... (c'est mieux que le mien)
Peter.O
3
De plus, votre lien ne fonctionne plus!
1

Variable de shell: Court terme, Appliqué uniquement à l'instance actuelle du shell, Non applicable à l'échelle du système

Variable environnementale: utilisation à long terme, valable pour l'ensemble du système, globalement autorisée

Par convention, Shell Variable a pour nom Minuscule et Envn. Les variables sont écrites en majuscules

Ashish
la source
-1

Pour répondre à cette question, essayez d’abord de comprendre la portée d’une variable.

Lorsque vous créez une nouvelle variable telle SOME_ENV_VARIABLE="testing.txt"qu’elle réside dans le fichier SHELL scope, cela signifie qu’elle peut être consultée par cette instance du shell où l’utilisateur est connecté. Lorsque l’instance change, par exemple, vous ouvrez un nouveau terminal ou vous changez le shell (par exemple, vous passez à csh) vous ne pouvez pas accéder à cette variable.

Lorsque vous exportez cette variable, export SOME_ENV_VARIABLEcette variable est désormais disponible dans la portée de l'environnement. Cela signifie que si vous modifiez le shell, vous pouvez toujours accéder à cette variable. Essayons de comprendre avec l'exemple suivant:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Analogie: supposons que vous possédiez un appartement de deux chambres et que vous le partagiez avec un autre colocataire. L’espace commun est accessible à tout le monde, mais pas à vos chambres. La variable d’environnement est semblable à un espace commun et la coquille, à une chambre, si vous voulez quelque chose dans cet espace commun, vous pouvez y accéder. être accessible par vous.

N'oubliez pas que si vous ouvrez un nouveau terminal, vous ne pourrez accéder à aucune des variables car vous modifiez cette instance . Pour cela, vous devez ajouter vos variables dans l’un .profileou l’ autre .bashrc(si vous utilisez bash).

Vishrant
la source