Comment définir une variable d'environnement utilisateur? (en permanence, pas en session)


145

Ceci m'énerve. J'ai vu plusieurs suggestions (toutes utilisant des fichiers et une syntaxe différents) et aucune d'entre elles n'a fonctionné.

Comment définir une variable d'environnement pour un utilisateur spécifique? Je suis sur Debian Squeeze. Quelle est la syntaxe exacte que je devrais mettre dans le fichier pour faire ABC = "123"?


7
Qu'as-tu déjà essayé?
l0b0

1
éditer .bashrc, .bash_profile, .profile et .ssh / eviroment. Bien que je ne sache pas si je l'ai écrit au bon endroit ou s'il avait la bonne syntaxe à chaque fois

4
.bashrcest le lieu principal pour cela.
rozcietrzewiacz

@rozcietrzewiacz: ok, mais ... même après avoir eu la solution, j'ai essayé de définir ABC1 et ABC2 au début et à la fin de ce fichier et ce n'est pas défini dans mon environnement.

1
Vérifiez que .bash_profilecontient quelque chose comme [[ -f ~/.bashrc ]] && . ~/.bashrc.
rozcietrzewiacz

Réponses:


113

Vous devez mettre la déclaration dans les fichiers d'initialisation de votre shell:

  • Si vous utilisez bash, ash, ksh ou un autre shell de style Bourne, vous pouvez ajouter

    ABC="123"; export ABC
    

    dans votre .profiledossier ( ${HOME}/.profile). C'est la situation par défaut sur la plupart des installations Unix, et en particulier sur Debian.

    Si votre shell de connexion est bash, vous pouvez utiliser .bash_profile( ${HOME}/.bash_profile) ou à la .bash_loginplace.

    Remarque: Si l'un de ces fichiers existe et que votre shell de connexion est en bash, il .profilen'est pas lu lorsque vous vous connectez via ssh ou sur une console de saisie, mais il peut quand même être lu à la place .bash_profilesi vous vous connectez à partir de l'interface graphique. En outre, s'il n'y a pas .bash_profile, alors utilisez .bashrc.

  • Si vous avez défini zsh comme shell de connexion, utilisez à la ~/.zprofileplace de ~/.profile.

  • Si vous utilisez tcsh, ajoutez

    setenv ABC "123"
    

    dans le .loginfichier ( ${HOME}/.login)

  • Si vous utilisez un autre shell, consultez le manuel du shell pour savoir comment définir les variables d'environnement et quels fichiers sont exécutés au démarrage du shell.


5
Le comportement par défaut de su userest de changer la propriété du shell actuel en le nom d'utilisateur arg, tout en conservant le répertoire de base et l'environnement de l'utilisateur appelant. Pour entrer dans un shell de manière à devenir le nouvel utilisateur et à obtenir tous ses paramètres d'environnement ($ PATH, $ HOME, $ ABC, etc.), vous devez passer un - en tant que premier argument de su. su - usernameva accomplir ce que vous demandez.
Tim Kennedy le

1
Attendez: qu'entendez-vous par "abandonné à la racine"? Dans tous les cas, faire un 'su' n'initialise pas le shell. Vous avez besoin de 'su -' (voir man su)
Matteo

1
Pourquoi avez-vous suen premier lieu? Ne venez-vous pas de créer un compte appartenant à la racine .profilequi ne peut pas être utilisé par l'utilisateur?
rozcietrzewiacz

1
@acid c'est ce qui aurait dû être fait. La question est de savoir quelle est la source lorsque vous vous connectez. Pour vérifier cela, déconnectez- vous d' abord.
rozcietrzewiacz

7
Étant donné que .profiletous les shells compatibles Bourne lisent, vous ne devez pas écrire la syntaxe Bash dans ce fichier. En particulier, export VARIABLE=valuedoit être refondu dans VARIABLE=value; export VARIABLE.
tripleee

48

Utilisez /etc/environmentfichier pour définir les variables d'environnement. Ajoutez ensuite la ligne suivante dans le /etc/environmentfichier.

ABC="123"

Maintenant, la variable ABC sera accessible à partir de toutes les sessions utilisateur. Pour tester la sortie de variable, commencez par actualiser la variable d'environnement à l'aide de la commande

source /etc/environment

et courir echo $ABC.


4
+1 pour la commande source. Cela manquait dans toutes les réponses
Nerrve

5
Attention, cela /etc/environmentne prend pas en charge la syntaxe complète bash, ce que j'ai découvert à la dure. Par exemple, mettre PATH="/usr/bin:/usr/sbin"et faire PATH="$PATH:/foo/bar"sur une ligne suivante ne fonctionnera pas
user2428118

Je ne sais pas s'il s'agit d'un problème personnel ou quoi, mais je devais redémarrer mon système d'exploitation après l'avoir défini /etc/environment, même si j'avais redémarré le terminal bash ou tapé source /etc/environment. Donc, si vous rencontrez des problèmes où la variable d'environnement ne se perpétue pas, essayez de redémarrer.
Blairg23

9

C'est une procédure générale que vous pouvez utiliser pour à peu près n'importe quel shell. Dans tous les cas, vous devez savoir à quel shell l'utilisateur se connectera normalement avec:

path="$(grep $USER /etc/passwd | cut -d ':' -f 7)"
shell="$(basename -- "$path")"

Ensuite, vous devez déterminer quels fichiers de points ce shell devrait normalement lire:

man $shell

Un raccourci qui pourrait fonctionner est de lister les fichiers contenant le nom du shell:

ls ~/.*${shell}*

Si vous voulez vérifier si l'un des fichiers est réellement lu lors de la connexion, vous pouvez simplement imprimer le nom du fichier dans chacun d'eux, par exemple:

echo .bashrc

Lors de la connexion, vous devriez alors voir quels fichiers sont en train d'être lus et décider lequel modifier. Attention, vous ne devriez pas essayer d’utiliser echo "$0"ou d’autres choses semblables, car la valeur de $0dépend de la façon dont le shell traite les fichiers point et pourrait être trompeuse.

Quand il s'agit de déclarer la variable "de manière permanente", notez que cela ne concerne que la session. Il n'y a aucun moyen d'accéder à la valeur d'une variable sans session, elle n'a donc aucune signification en dehors de celle-ci. Si vous voulez dire "en lecture seule", cela dépend du shell, et dans Bash, vous pouvez utiliser:

declare -r VAR

s'il a déjà une valeur, ou

declare -r VAR=value

l'assigner en même temps. Tous les obus ne possèdent pas cette fonctionnalité.

Pour déclarer une variable dans la plupart des shells, vous devez utiliser une variable name ( [A-Za-z_][A-Za-z0-9_]*), suivie d'un signe égal (et d' aucun espace autour du signe égal), puis d'une valeur (de préférence entre guillemets, à moins que la valeur ne soit simple [A-Za-z0-9_]+). Par exemple:

name="John Doe"
ip=127.0.0.1
HORRIBLE=1

5

Utilisez export.

export ABC="123"

Pour vérifier si elle est définie, utilisez

env

et / ou

env | grep ABC

Pour l'ajouter définitivement, ajoutez ceci à votre ~/.bashrcfichier.

export ABC="123"

6
Il veut savoir chaud pour le définir en permanence , c'est-à-dire dans quel fichier mettre la définition.
Matteo

1
Ne fonctionne pas. Une fois que je me déconnecte, la variable est partie. J'en ai besoin d'une session à l'autre

1
tu veux dire permenateet pas permenently: D
whoami

regardez modification pourbashrc
whoami

5
ce qui est permenate? tu veux dire permanent?
SSH Ce

3

La commande exacte est:

echo 'export ABC = "123"' >> ~/.profile

4
Exactement? Sérieusement? Quel shell (a) lit ~/.profileet (b) laisse de l'espace avant et après =?
G-Man

1

La meilleure façon qui a fonctionné pour moi est de modifier le fichier .bashrc dans le shell BASH.

utilisez ceci par exemple:

  1. ouvrez votre fichier .bashrc
  2. ajoutez cette ligne:

    export <VARIABLE> = "<ANY PATH/VALUE you want>"
    

    par exemple : export HOME = "/home/user/"

    N'oubliez pas ""que l'utilisation ' 'ne fonctionnera pas et que votre fichier bashrc signalera une erreur lors du sourcing.

  3. source dans la session en cours.

J'ai également essayé de modifier le fichier / etc / environment, mais cela ne m'a pas permis de créer une nouvelle variable d'environnement et, lorsque je l'ai obtenue, cela m'a incité à indiquer que la variable définie est introuvable.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.