Jak ustawić zmienną środowiskową użytkownika? (na stałe, nie sesja)

145

To mnie denerwuje. Widziałem kilka sugestii (wszystkie wykorzystujące różne pliki i składnię) i żadna z nich nie działała.

Jak ustawić zmienną środowiskową dla konkretnego użytkownika? Jestem w trakcie ściśnięcia Debiana. Jaka jest dokładna składnia, którą powinienem umieścić w pliku, aby ABC = „123”?

Gilles
źródło
7
Czego już próbowałeś?
l0b0
1
edycja .bashrc, .bash_profile, .profile i .ssh / eviroment. Chociaż nie wiem, czy napisałem go we właściwym miejscu, czy za każdym razem miałem odpowiednią składnię
4
.bashrcjest do tego głównym miejscem.
rozcietrzewiacz
@rozcietrzewiacz: ok, ale ... nawet po uzyskaniu rozwiązania próbowałem ustawić ABC1 i ABC2 na początku i na końcu tego pliku i nie jest on ustawiony w moim środowisku.
1
Sprawdź, czy .bash_profilezawiera coś takiego [[ -f ~/.bashrc ]] && . ~/.bashrc.
rozcietrzewiacz

Odpowiedzi:

113

Musisz umieścić deklarację w plikach inicjujących powłokę:

  • Jeśli używasz powłoki bash, ash, ksh lub innej powłoki w stylu Bourne'a, możesz dodać

    ABC="123"; export ABC
    

    w twoim .profilepliku ( ${HOME}/.profile). Jest to domyślna sytuacja w większości instalacji Uniksa, w szczególności w Debianie.

    Jeśli twoja powłoka logowania jest bash, możesz użyć .bash_profile( ${HOME}/.bash_profile) lub .bash_loginzamiast tego.

    Uwaga: Jeśli którykolwiek z tych plików istnieje i twoja powłoka logowania jest bash, .profilenie jest odczytywany podczas logowania przez ssh lub na konsoli tekstowej, ale może być nadal czytany zamiast, .bash_profilejeśli logujesz się z GUI. Ponadto, jeśli nie ma .bash_profile, użyj .bashrc.

  • Jeśli ustawiłeś zsh jako powłokę logowania, użyj ~/.zprofilezamiast ~/.profile.

  • Jeśli używasz tcsh, dodaj

    setenv ABC "123"
    

    w .loginpliku ( ${HOME}/.login)

  • jeśli używasz innej powłoki, zapoznaj się z instrukcją powłoki, jak definiować zmienne środowiskowe i które pliki są uruchamiane podczas uruchamiania powłoki.

Matteo
źródło
5
Domyślnym zachowaniem su userjest zmiana własności bieżącej powłoki na nazwę użytkownika arg, przy jednoczesnym zachowaniu katalogu domowego i środowiska użytkownika wywołującego. Aby wejść do powłoki w taki sposób, aby stać się nowym użytkownikiem i uzyskać wszystkie ustawienia środowiska ($ PATH, $ HOME, $ ABC itp.), Musisz przekazać - jako pierwszy argument su. su - usernameosiągnie to, o co prosisz.
Tim Kennedy,
1
Czekaj: co rozumiesz przez „exited to root”? W każdym razie wykonanie „su” nie inicjuje powłoki. Potrzebujesz 'su -' (patrz man su)
Matteo
1
Dlaczego suw pierwszej kolejności? Czy nie stworzyłeś właśnie roota, z którego .profilenie może korzystać użytkownik?
rozcietrzewiacz
1
@kwas to, co należy zrobić. Pytanie brzmi, co jest pozyskiwane po zalogowaniu. Aby to sprawdzić, najpierw się wyloguj .
rozcietrzewiacz
7
Ponieważ .profilejest odczytywany przez wszystkie powłoki zgodne z Bourne, nie powinieneś pisać w tym pliku składni Bash. W szczególności export VARIABLE=valuenależy zmienić na VARIABLE=value; export VARIABLE.
tripleee
48

Użyj /etc/environmentpliku do ustawienia zmiennych środowiskowych. Następnie dodaj następujący wiersz do /etc/environmentpliku.

ABC="123"

Teraz zmienna ABC będzie dostępna ze wszystkich sesji użytkownika. Aby przetestować wyjście zmiennej, najpierw odśwież zmienną środowiskową za pomocą polecenia

source /etc/environment

i biegnij echo $ABC.

Hokam
źródło
4
+1 dla polecenia źródłowego. Tego brakowało we wszystkich odpowiedziach
Nerrve
5
Uważaj, aby /etc/environmentnie obsługiwać pełnej składni bash, co wymyśliłem na własnej skórze. Na przykład wstawianie, PATH="/usr/bin:/usr/sbin"a następnie wykonywanie PATH="$PATH:/foo/bar"w poniższym wierszu nie będzie działać
user2428118
Nie jestem pewien, czy jest to osobisty problem lub co, ale musiałem zrestartować system operacyjny po ustawieniu tego /etc/environment, nawet jeśli ponownie uruchomiłem terminal bash lub wpisałem source /etc/environment. Więc jeśli masz problemy, w których zmienna środowiskowa nie utrwala się, spróbuj ponownie uruchomić komputer.
Blairg23,
9

Jest to ogólna procedura, której można użyć dla praktycznie dowolnej powłoki. W każdym razie musisz wiedzieć, z której powłoki użytkownik logowałby się normalnie:

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

Następnie musisz dowiedzieć się, które pliki kropek normalnie czytają te powłoki:

man $shell

Skrótem, który może działać, jest lista plików kropek zawierających nazwę powłoki:

ls ~/.*${shell}*

Jeśli chcesz sprawdzić, czy jeden z plików jest rzeczywiście odczytywany podczas logowania, możesz po prostu wydrukować nazwę pliku w każdym z nich, na przykład:

echo .bashrc

Podczas logowania powinieneś zobaczyć, które pliki są odczytywane i możesz zdecydować, który z nich zmodyfikować. Uważaj, że nie powinieneś próbować używać echo "$0"lub podobnego, ponieważ wartość $0zależy od tego, jak powłoka przetwarza pliki kropkowe, i może być myląca.

Jeśli chodzi o deklarowanie zmiennej „na stałe”, pamiętaj, że dotyczy to tylko sesji. Nie ma możliwości uzyskania dostępu do wartości zmiennej bez sesji, więc nie ma ona znaczenia poza jedną. Jeśli masz na myśli „tylko do odczytu”, to jest zależne od powłoki, aw Bash możesz użyć:

declare -r VAR

jeśli ma już wartość, lub

declare -r VAR=value

aby przypisać to w tym samym czasie. Nie wszystkie muszle mają tę funkcję.

Aby zadeklarować zmienną w większości powłok, należy użyć nazwy zmiennej ( [A-Za-z_][A-Za-z0-9_]*), po której następuje znak równości (i bez spacji wokół znaku równości), a następnie wartość (najlepiej cytowana, chyba że wartość jest prosta [A-Za-z0-9_]+). Na przykład:

name="John Doe"
ip=127.0.0.1
HORRIBLE=1
l0b0
źródło
5

Użyj eksportu.

export ABC="123"

Aby sprawdzić, czy jest ustawiony, użyj

env

i / lub

env | grep ABC

Aby dodać go na stałe, dodaj go do swojego ~/.bashrcpliku.

export ABC="123"
kim jestem
źródło
6
Chce wiedzieć, jak go zdefiniować na stałe , tzn. W jakim pliku umieścić definicję.
Matteo,
1
Nie działa Po wylogowaniu zmienna zniknęła. Potrzebuję go między sesjami
1
masz na myśli permenatei nie permenently: D
whoami
spójrz na edycjębashrc
whoami
5
co permenatejest masz na myśli permanent?
SSH To
3

Dokładne polecenie to:

echo 'export ABC = "123"' >> ~/.profile
Иван Бишевац
źródło
4
Dokładnie? Poważnie? Jaka powłoka (a) czyta ~/.profilei (b) pozwala na spację przed i po =?
G-Man,
1

Najlepszym sposobem, który działał dla mnie, jest modyfikacja pliku .bashrc w powłoce BASH.

użyj tego na przykład:

  1. otwórz plik .bashrc
  2. dodaj tę linię:

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

    np .: export HOME = "/home/user/"

    Pamiętaj, aby używać, ""ponieważ użycie ' 'nie będzie działać, a plik bashrc zgłosi błąd podczas pozyskiwania.

  3. źródło w bieżącej sesji.

Próbowałem również zmodyfikować plik środowiskowy / etc /, ale nie pozwoliło mi to utworzyć nowej zmiennej środowiskowej, a gdy ją pozyskałem, wystąpił błąd, że nie można znaleźć zdefiniowanej zmiennej.

Ayushi Agarwal
źródło