`setx` équivalent dans Ubuntu

9

Windows a une commande powershell appelée setxqui crée ou modifie des variables d'environnement dans l'environnement utilisateur ou système.

Ubuntu a-t-il une commande similaire, c'est-à-dire pas en utilisant nanoou vi, juste une ligne pour ajouter ou mettre à jour une variable d'environnement à l'échelle du système.

Solution implémentée

Une ligne à ajouter / mettre à jour

grep env_name /etc/environment && sed -i.bak 's/env_name=.*/env_name="env_value"/' /etc/environment || echo 'env_name="env_value"' >> /etc/environment
Ayman
la source

Réponses:

12

Vous pouvez le faire simplement en le déclarant nouveau dans la ligne de commande ou en le déclarant à nouveau. Par exemple, si vous souhaitez ajouter ~/testfolderà votre variable de chemin, vous pouvez simplement l'entrer dans votre terminal actuel (ce n'est qu'un exemple):

PATH="$HOME/testfolder:$PATH"

Bien entendu, cela ne le modifiera que pendant la durée d'ouverture de la session de terminal. Remarquez l' $utilisation ici, vous la laissez en dehors de la déclaration, mais si vous voulez l'afficher, vous devez l'ajouter $pour développer son contenu.

Si vous souhaitez les déclarer plus durables et plus généraux, vous pouvez les ajouter dans votre ~/.bashrcfichier (uniquement pour vous) ou dans /etc/bash.bashrc(à l'échelle du système) par exemple si vous voulez qu'ils comptent pour vous seul ou pour tous les utilisateurs. Une autre option consiste à l'ajouter à votre .profilefichier (uniquement pour vous-même) où il sera viable à partir du moment où vous vous connecterez. Vous pouvez le faire echopar exemple si vous êtes sûr que cette variable n'est pas déjà définie ou si vous en créez de nouvelles (seulement un exemple):

echo "variable=value" >> /path/filename

Si vous souhaitez toutefois modifier un fichier en dehors de votre répertoire utilisateur, ce qui est le cas lorsque vous souhaitez le modifier, /etc/bash.bashrcvous devez l'utiliser sudoet vous ne pouvez donc pas simplement utiliser un `` document ici '' car cela ne fonctionnerait pas, utilisez plutôt une ligne comme ci-dessous:

echo "variable=value" | sudo tee -a /path/filename

Si la variable existe cependant déjà, vous pouvez la changer avec la sedcommande (aussi seulement un exemple):

sed -i.bak 's/variable=value/variable=new-value/' /path/filename

Cela modifiera la variable dans le fichier mais créera une sauvegarde de celle-ci avant la modification. Si vous modifiez des fichiers en dehors de votre répertoire utilisateur avec sed, vous devez utiliser sudodans la plupart des cas, la ligne serait donc:

sudo sed -i.bak 's/variable=value/variable=new-value/' /path/filename

La suppression d'une variable d'un fichier peut également être effectuée sed, laissez simplement la deuxième partie de l'expression régulière vide:

sed -i.bak 's/variable=value//' /path/filename

Si vous êtes intéressé par les variables d'environnement définies, vous pouvez utiliser la envcommande pour les répertorier, ( set -o posix ; set ) | lessou sh -c set. Tous les trois donnent différentes quantités de sortie, avec ( set -o posix ; set ) | lessen retour le plus de variables qui sont réellement définies.

Videonauth
la source
1
Au lieu de ( set -o posix ; set )c'est plus simple à dire sh -c set. Cela fonctionnera même s'il shs'agit d'un lien symbolique vers bash(qui n'est pas normalement sur les versions Ubuntu modernes).
Ruslan
@ruslan n'affiche sh -c setpas vraiment toutes les variables d'environnement définies sur le système. Cependant, je vais l'inclure comme troisième moyen d'en montrer certains.
Videonauth
Affiche en sh -c setfait toutes les variables d' environnement . Il n'affiche simplement pas les variables shell du shell appelant, mais elles ne sont jamais héritées par un processus que vous exécutez à partir de ce shell, sauf si vous exportles avez .
Ruslan
Y a-t-il jamais une raison valable de modifier /etc/environment? On dirait que c'est un raccourci vers la confusion.
Roger Lipscombe
@RogerLipscombe Merci, je n'en étais pas sûr, c'est toujours un endroit viable pour éditer des variables, mais je l'ai retiré pour ne pas créer de confusion.
Videonauth
11

Il n'y a pas d'équivalent direct de setx /m, mais il existe des moyens d'accomplir ce qui setx /mfait.

setx /mmet variable=valueen HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Non / m (soit par utilisateur) setxmet simplement variable=valueen HKCU\Environment.

Vous avez spécifiquement demandé «à l'échelle du système». Pour cela, vous devez ajouter la paire de valeurs variables à /etc/environmentOU à /etc/profile.d/<yourfile>. Le premier est évalué par pam, tandis que le second est évalué par /bin/sh. Ainsi, dans /etc/profile.d/<yourfile>, vous ajouteriez variable=value; export variable. (bash le permet également export variable=value). Car /etc/environmentvous ajouteriez variable=value.

Les équivalents par utilisateur sont ~/.pam_environmentet ~/.profile.

Voir aussi: https://help.ubuntu.com/community/EnvironmentVariables

Cyrus Patel
la source
7

Vous pouvez exporter des variables d'environnement sur la ligne de commande, mais cela n'affectera pas l'environnement effectif dans les processus déjà démarrés, uniquement dans le processus en cours et ses sous-processus. Dans la pratique, vous devez donc souvent vous reconnecter lorsque vous modifiez des variables d'environnement.

Gunnar Hjalmarsson
la source