Odpowiednik `setx` w Ubuntu

10

Windows ma komendę PowerShell o nazwie, setxktóra Tworzy lub modyfikuje zmienne środowiskowe w środowisku użytkownika lub systemu.

Czy Ubuntu ma podobne polecenie, tzn. Nie używa nanoani vi, albo tylko jednego wiersza, aby dodać lub zaktualizować zmienną środowiskową w całym systemie.

Wdrożone rozwiązanie

Jedna linia do dodania / aktualizacji

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
źródło

Odpowiedzi:

12

Możesz to zrobić po prostu zadeklarując jako nowy w wierszu poleceń lub ponownie deklarując. Na przykład, jeśli chcesz dodać ~/testfolderdo zmiennej ścieżki, możesz po prostu wpisać ją w bieżącym terminalu (to tylko przykład):

PATH="$HOME/testfolder:$PATH"

To oczywiście zmieni to tylko na czas, kiedy powiedziałeś, że sesja terminalowa jest otwarta. Zwróć uwagę na $użycie tutaj, pomijasz je dla deklaracji, ale jeśli chcesz je wyświetlić, musisz dodać, $aby rozwinąć jego zawartość.

Jeśli chcesz zadeklarować, że są bardziej trwałe i ogólne, możesz dodać je do ~/.bashrcpliku (tylko dla Ciebie) lub do /etc/bash.bashrc(całego systemu), na przykład, jeśli chcesz, aby liczyły się tylko dla Ciebie lub dla wszystkich użytkowników. Inną opcją jest dodanie go do .profilepliku (tylko dla siebie), gdzie będzie to możliwe od momentu zalogowania. Możesz to zrobić echona przykład, jeśli masz pewność, że ta zmienna nie jest już ustawiona lub jeśli tworzysz nowe (tylko przykład):

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

Jeśli jednak chcesz edytować plik poza katalogiem użytkownika, co ma miejsce w przypadku edycji /etc/bash.bashrc, musisz użyć, sudowięc nie możesz po prostu użyć „dokumentu tutaj”, ponieważ to nie zadziała, zamiast tego użyj linii takiej jak poniżej:

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

Jeśli zmienna już istnieje, możesz ją zmienić za pomocą sedpolecenia (również tylko przykład):

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

Spowoduje to edycję zmiennej w pliku, ale utworzy kopię zapasową przed edycją. Jeśli zmienisz pliki poza katalogiem użytkownika za pomocą sed, musisz użyć sudow większości przypadków, aby wiersz brzmiał:

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

Usunięcie zmiennej z pliku można również wykonać sed, wystarczy pozostawić drugą część wyrażenia regularnego pustą:

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

Jeśli jesteś zainteresowany, które zmienne środowiskowe są ustawione, możesz użyć envpolecenia, aby je wyświetlić, ( set -o posix ; set ) | lesslub sh -c set. Wszystkie trzy dają różne wartości wyjściowe, ( set -o posix ; set ) | lesszwracając najwięcej ustawionych zmiennych.

Videonauth
źródło
1
Zamiast ( set -o posix ; set )łatwiej powiedzieć sh -c set. Działa to nawet, jeśli shjest dowiązaniem symbolicznym do bash(co zwykle nie jest dostępne w nowoczesnych wersjach Ubuntu).
Ruslan
@ruslan sh -c setnie pokazuje tak naprawdę wszystkich zmiennych środowiskowych ustawionych w systemie. Jednak dołączę to jako trzeci sposób pokazania niektórych z nich.
Videonauth
Właściwie sh -c setpokazuje wszystkie zmienne środowiskowe . Po prostu nie pokazuje zmiennych powłoki wywołującej powłoki, ale nigdy nie są dziedziczone przez proces uruchamiany z tej powłoki, chyba że ty export.
Ruslan
Czy kiedykolwiek istnieje ważny powód do edycji /etc/environment? Wydaje się, że to skrót do zamieszania.
Roger Lipscombe,
@RogerLipscombe Dziękuję, nie byłem tego pewien, nadal jest to opłacalne miejsce do edycji zmiennych, ale wyjąłem to, aby nie powodować zamieszania.
Videonauth,
11

Nie ma bezpośredniego odpowiednika setx /m, ale istnieją sposoby na osiągnięcie tego, co się setx /mdzieje.

setx /mputs variable=valuein HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment. Nie- / m (tj per-user) setxpo prostu wkłada variable=valuesię HKCU\Environment.

W szczególności poprosiłeś o „systemowy”. W tym celu należy dodać parę wartości zmiennej do /etc/environmentOR lub do /etc/profile.d/<yourfile>. Pierwszy jest oceniany przez pam, a drugi przez /bin/sh. W ten sposób /etc/profile.d/<yourfile>dodałbyś variable=value; export variable. (bash także pozwala export variable=value). Do /etc/environmentdodania variable=value.

Odpowiednikami na użytkownika są ~/.pam_environmenti ~/.profile.

Zobacz także: https://help.ubuntu.com/community/EnvironmentVariables

Cyrus Patel
źródło
7

Możesz eksportować zmienne środowiskowe z wiersza poleceń, ale nie wpłynie to na efektywne środowisko w już uruchomionych procesach, tylko w bieżącym procesie i jego podprocesach. W praktyce więc często trzeba ponownie zalogować się podczas zmiany zmiennych środowiskowych.

Gunnar Hjalmarsson
źródło