Spraw, aby $ JAVA_HOME można było łatwo zmieniać w Ubuntu [zamknięte]

139

W Ubuntu chciałbym przełączać moją zmienną środowiskową JAVA_HOME tam iz powrotem między Java 5 i 6.

Otwieram terminal i wpisuję następujące polecenie, aby ustawić zmienną środowiskową JAVA_HOME:

export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun

W tym samym oknie terminala wpisuję co następuje, aby sprawdzić, czy zmienna środowiskowa została zaktualizowana:

echo $JAVA_HOME

I widzę /usr/lib/jvm/java-1.5.0-sun, co jest tym, czego się spodziewam. Dodatkowo modyfikuję ~ / .profile i ustawiam zmienną środowiskową JAVA_HOME na /usr/lib/jvm/java-1.5.0-sun.

A teraz problem - kiedy otwieram nowe okno terminala i sprawdzam zmienną środowiskową JAVA_HOME, wpisując echo $ JAVA_HOME , widzę, że moja zmienna środowiskowa JAVA_HOME została przywrócona do Java 6. Kiedy ponownie uruchamiam komputer (lub loguję tam iz powrotem, jak przypuszczam) zmienna środowiskowa JAVA_HOME jest ustawiona na Java 5 (prawdopodobnie z powodu modyfikacji, którą wprowadziłem w moim ~ / .profile).

Czy istnieje sposób wokół to tak, że mogę zmienić JAVA_HOME środowiska, bez konieczności logowania się i z powrotem w (i uczynić tę zmienną środowiskową zmiany kij we wszystkich nowych terminali systemu Windows)?

Junho Park
źródło
29
Jaka jest prawidłowa witryna i podwójna odpowiedź?
Martin Konicek
~/.profilePlik jest tylko do odczytu podczas logowania do Ubuntu, więc jeśli logout / login następnie JAVA_HOME jest ustawiony dla wszystkich terminali i innych aplikacjach uruchamianych. Jeśli ustawisz JAVA_HOME ~/.bashrc, będzie to widoczne tylko dla aplikacji uruchamianych z terminala.
jr0cket

Odpowiedzi:

196

Umieść zmienne środowiskowe w /etc/environmentpliku globalnym :

...
export JAVA_HOME=/usr/lib/jvm/java-1.5.0-sun
...

Wykonaj „source / etc / environment” w każdej powłoce, w której chcesz zaktualizować zmienne:

$ source /etc/environment

Sprawdź, czy działa:

$ echo $JAVA_HOME
$ /usr/lib/jvm/java-1.5.0-sun

Świetnie, wylogowywanie się nie jest potrzebne.

Jeśli chcesz ustawić zmienną środowiskową JAVA_HOME tylko w terminalu, ustaw ją w pliku ~ / .bashrc .

Martin Konicek
źródło
9
Ponowne uruchomienie jest nadal potrzebne, aby te zmiany wpłynęły na aplikacje uruchamiane za pośrednictwem interfejsu użytkownika Ubuntu (tj. Dwukrotne kliknięcie aplikacji)
Eric Hu,
7
Czym to się różni od zwykłego ustawienia zmiennej w każdej skorupce pieprzonej osoby?
mlissner
1
Innym sposobem
uniknięcia konieczności
1
@MartinKonicek Twój przykład jest nieprawidłowy. w tej linii nie powinno być wyrażenia „eksport”. / etc / environment zawiera pary klucz-wartość
pdeva
1
pamiętaj, że /etc/environmentjest to specjalne i nie pozwala na podstawianie zmiennych, np. JRE_HOME=${JAVA_HOME}/jrenie zadziała.
Abdull
31

To prawdopodobnie rozwiąże Twój problem: https://help.ubuntu.com/community/EnvironmentVariables

Zmienne środowiskowe dotyczące całej sesji

Aby ustawić zmienne środowiskowe w sposób wpływający na środowisko konkretnego użytkownika, nie należy umieszczać poleceń ustawiających ich wartości w poszczególnych plikach skryptów powłoki w katalogu domowym użytkownika, ale używać:

~ / .pam_environment - ten plik jest przeznaczony specjalnie do ustawiania środowiska użytkownika. Nie jest to plik skryptu, ale raczej składa się z wyrażeń przypisania, po jednym w każdym wierszu.

Niepolecane:

~ / .profile - jest to prawdopodobnie najlepszy plik do umieszczania przypisań zmiennych środowiskowych, ponieważ jest wykonywany automatycznie przez DisplayManagera podczas sesji pulpitu procesu uruchamiania, a także przez powłokę logowania, gdy logujesz się z konsoli tekstowej.

Holger Frohloff
źródło
Z podanego linku: „Poniższe nie są zalecane, ale poprzednie rozwiązanie (?) Podane na tej stronie nie działało z wersją pulpitu 10.04. .Pam_environment nie jest naturalnie przetwarzany wraz z dystrybucją.”
Calmarius
14
~ / .pam_environment to świetny sposób na zablokowanie logowania, jeśli założymy, że przetwarza zmienne. Próbowałem ustawić PATH na $ {PATH}: $ {HOME} / bin i nie udało mi się ocenić zmiennych. Wynik netto: nie można się zalogować :( Naprawiono, odwiedzając Ctrl-Alt-1 i uruchamiając „/ bin / rm ~ / .pam_environment”. Zachowaj szczególną ostrożność lub użyj drugiego konta do przetestowania ustawień tutaj.
Alain O'Dea
6
Osobiście nie wiem, dlaczego zadali sobie trud tworzenia pliku środowiskowego, a potem sprawili, że zadziałał zupełnie inaczej niż jakikolwiek inny mechanizm ustawiania zmiennych środowiskowych, który działał kiedykolwiek wcześniej. Proste pary klucz-wartość, takie jak używane przez plik środowiska, to zwykły BS. Jest powód, dla którego używamy zmiennych i linków w środowisku i nadal ma to swoje zalety. Upraszcza administrację. Kimkolwiek są bozos, którzy zdecydowali, że sposób robienia rzeczy w tym pliku przez PAM jest najlepszy, to w najlepszym razie imbecyle. Zmienne MUSZĄ być interpretowane.
Bill Rosmus
1
@ AlainO'Dea: Miałem dokładnie ten sam problem. Zszokowany i zmartwiony, gdy nie mogłem przejść przez ekran logowania. Po pewnym czasie odkryłem, że możesz używać zmiennych, ale musisz użyć innej składni. na przykład. DOMYŚLNA ŚCIEŻKA = $ {ŚCIEŻKA}: $ {HOME} / bin Gdy nie używa zmiennej, proste przypisanie wydaje się działać.
tim_wonil
Tak, zgadzam się z @ AlainO'Dea. Jeśli w twoim skrypcie jest jakiś błąd, nie będziesz mógł się zalogować. Dbać.
Evan Hu,
13

Spróbuj wykonać te czynności.

- Zamierzamy edytować "etc \ profile". Zmienne środowiskowe należy wprowadzić na końcu pliku. Ponieważ Ubuntu nie daje dostępu do folderu głównego, będziemy musieli użyć kilku poleceń w terminalu

Krok 1: Uruchom Terminal. Wpisz polecenie:gksudo gedit /etc/profile

Krok 2: Otworzy się plik tekstowy profilu. Wprowadź zmienne środowiskowe na dole strony ........... np .: export JAVA_HOME=/home/alex/jdk1.6.0_22/bin/java

export PATH=/home/alex/jdk1.6.0_22/bin:$PATH

krok 3: zapisz i zamknij plik. Sprawdź, czy zmienne środowiskowe są ustawione za pomocą polecenia echo ........ Np echo $PATH

Alex
źródło
9

Musisz umieścić w ~/.bashrcpliku definicję zmiennej .

Ze strony podręcznika bash:

Kiedy uruchamiana jest powłoka interaktywna, która nie jest powłoką logowania, bash czyta i wykonuje polecenia z /etc/bash.bashrc i ~ / .bashrc, jeśli te pliki istnieją.

Paweł Nadolski
źródło
5

Tradycyjnie, jeśli chcesz zmienić zmienną tylko w oknach terminala, ustaw ją w .bashrcpliku, który jest pobierany za każdym razem, gdy otwierany jest nowy terminal. .profileplik nie jest pobierany za każdym razem, gdy otwierasz nowy terminal.

Zobacz różnicę między .profile i .bashrc: Jaka jest różnica między .bashrc, .bash_profile i .environment?

.bashrcpowinien rozwiązać twój problem. Jednak nie jest to właściwe rozwiązanie, ponieważ używasz Ubuntu. Zobacz odpowiednią stronę pomocy Ubuntu „ Zmienne środowiskowe dla całej sesji ”. Dlatego nic dziwnego, że .profileto nie działa dla Ciebie. Używam Ubuntu 12.04 i xfce. Skonfigurowałem mój .profilei po prostu nie działa, nawet jeśli się wyloguję i zaloguję. Podobne doświadczenie tutaj . Być może będziesz musiał użyć .pam_environmentpliku i całkowicie zapomnieć o .profilei .bashrc. UWAGA, że .pam_environmentnie jest to plik skryptu.

HongboZhu
źródło
1

Spójrz bash(1), potrzebujesz powłoki logowania, aby pobrać ~/.profile, tj. -lOpcję.

Nikolai Fetissov
źródło
1

Po wprowadzeniu zmian w .profile należy uruchomić plik, aby zmiany odniosły skutek.

root@masternode# . ~/.profile

Po wykonaniu tej czynności polecenie echo będzie działać.

CodeShane
źródło
Powinieneś ~/.profileraczej używać niż ./.profile.
Alexis Wilke