`setx` entspricht Ubuntu

9

Windows verfügt über einen Powershell-Befehl, setxder Umgebungsvariablen in der Benutzer- oder Systemumgebung erstellt oder ändert.

Hat Ubuntu einen ähnlichen Befehl, dh nicht mit nanooder vinur einer Zeile, um eine Umgebungsvariable systemweit hinzuzufügen oder zu aktualisieren?

Implementierte Lösung

Eine Zeile zum Hinzufügen / Aktualisieren

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
quelle

Antworten:

12

Sie können dies einfach tun, indem Sie es in der Befehlszeile als neu deklarieren oder erneut deklarieren. Wenn Sie beispielsweise ~/testfolderIhre Pfadvariable hinzufügen möchten , können Sie sie einfach in Ihr aktuelles Terminal eingeben (dies ist nur ein Beispiel):

PATH="$HOME/testfolder:$PATH"

Dies ändert sich natürlich nur für die Zeit, in der Sie die Terminalsitzung geöffnet haben. Beachten Sie die $Verwendung hier, Sie lassen sie für die Deklaration aus, aber wenn Sie sie anzeigen möchten, müssen Sie sie hinzufügen $, um ihren Inhalt zu erweitern.

Wenn Sie sie für dauerhafter und allgemeiner erklären möchten, können Sie sie in Ihre ~/.bashrc(nur für Sie) Datei oder in /etc/bash.bashrc(systemweit) hinzufügen, wenn Sie möchten, dass sie nur für Sie oder für alle Benutzer zählen. Eine andere Möglichkeit besteht darin, es Ihrer .profileDatei hinzuzufügen (nur für Sie selbst), wo es ab dem Moment Ihrer Anmeldung funktionsfähig ist. Sie können dies echobeispielsweise tun, wenn Sie sicher sind, dass diese Variable noch nicht festgelegt ist, oder wenn Sie neue erstellen (nur ein Beispiel):

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

Wenn Sie jedoch eine Datei außerhalb Ihres Benutzerverzeichnisses bearbeiten möchten, was beim Bearbeiten der Fall ist, /etc/bash.bashrcmüssen sudoSie sie verwenden. Daher können Sie nicht einfach ein "Hier-Dokument" verwenden, da dies nicht funktionieren würde. Verwenden Sie stattdessen eine Zeile wie die folgende:

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

Wenn die Variable jedoch bereits vorhanden ist, können Sie sie mit dem sedBefehl ändern (auch nur ein Beispiel):

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

Dadurch wird die Variable in der Datei bearbeitet, aber vor der Bearbeitung wird eine Sicherungskopie erstellt. Wenn Sie Dateien außerhalb Ihres Benutzerverzeichnisses mit sed ändern, müssen Sie sudoin den meisten Fällen Folgendes verwenden :

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

Das Entfernen einer Variablen aus einer Datei ist ebenfalls möglich. sedLassen Sie einfach den zweiten Teil des regulären Ausdrucks leer:

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

Wenn Sie interessiert sind, welche Umgebungsvariablen festgelegt sind, können Sie sie mit dem envBefehl auflisten, ( set -o posix ; set ) | lessoder sh -c set. Alle drei geben unterschiedliche Ausgabemengen an, ( set -o posix ; set ) | lesswobei die meisten tatsächlich gesetzten Variablen zurückgegeben werden.

Videonauth
quelle
1
Stattdessen ist ( set -o posix ; set )es einfacher zu sagen sh -c set. Dies funktioniert auch dann, wenn shes sich um einen Symlink handelt bash(was normalerweise bei modernen Ubuntu-Versionen nicht der Fall ist).
Ruslan
@ruslan sh -c setzeigt nicht wirklich alle auf dem System festgelegten Umgebungsvariablen an. Ich werde es jedoch als dritte Möglichkeit aufnehmen, um einige von ihnen zu zeigen.
Videonauth
sh -c setZeigt tatsächlich alle Umgebungsvariablen an . Es werden nur keine Shell- Variablen der aufrufenden Shell angezeigt, diese werden jedoch niemals von einem Prozess geerbt, den Sie von dieser Shell ausführen, es sei denn, Sie haben exportsie.
Ruslan
Gibt es jemals einen gültigen Grund zum Bearbeiten /etc/environment? Das scheint eine Abkürzung zur Verwirrung zu sein.
Roger Lipscombe
@RogerLipscombe Vielen Dank, ich war mir nicht sicher, es ist immer noch ein praktikabler Ort, um Variablen zu bearbeiten, aber ich habe es herausgenommen, um keine Verwirrung zu stiften.
Videonauth
11

Es gibt kein direktes Äquivalent zu setx /m, aber es gibt Möglichkeiten, das zu erreichen, was setx /mtut.

setx /msetzt variable=valueein HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Non- / m (dh pro Benutzer) setxsetzt einfach das variable=valuein HKCU\Environment.

Sie haben speziell nach "systemweit" gefragt. Dazu würden Sie das Variablen-Wert-Paar entweder /etc/environmentODER hinzufügen /etc/profile.d/<yourfile>. Ersteres wird von pam bewertet, während letzteres von ausgewertet wird /bin/sh. So /etc/profile.d/<yourfile>würden Sie in hinzufügen variable=value; export variable. (Bash erlaubt auch export variable=value). Denn /etc/environmentdu würdest hinzufügen variable=value.

Die Äquivalente pro Benutzer sind ~/.pam_environmentund ~/.profile.

Siehe auch: https://help.ubuntu.com/community/EnvironmentVariables

Cyrus Patel
quelle
7

Sie können Umgebungsvariablen über die Befehlszeile exportieren, dies wirkt sich jedoch nicht auf die effektive Umgebung in bereits gestarteten Prozessen aus, sondern nur auf den aktuellen Prozess und seine Unterprozesse. In der Praxis müssen Sie sich daher häufig neu anmelden, wenn Sie Umgebungsvariablen ändern.

Gunnar Hjalmarsson
quelle