Jak dodać zmienne środowiskowe?

363

Używam Ubuntu 11.04. Korzystam z terminala, aby rozpocząć sesję bash i chcę dodać zmienną środowiskową:

$r@hajt:~$ env THEVAR=/example

Ale to nie działa. Pokazuje wszystkie zmienne, przy czym THEVAR jest ostatnim, ale kolejne wywołanie do envnie pokazuje THEVARjuż - env | grep THEVARnic nie zwraca.

Podobnie skrypty z eksportem ( export THEVAR=/example) lub innymi przypisaniami zmiennych ( THEVAR=/example) nie dodają zmiennej środowiskowej.

Wiem, że robię coś złego, wiem, że to powinno być coś prostego, ale po prostu nie mogę tego znaleźć.

AKTUALIZACJA: Prawdziwe znaczenie mojego pytania było takie: https://stackoverflow.com/questions/496702/can-a-shell-script-set-environment-variables-of-the-calling-shell

(W każdym razie wybiorę najbardziej głosowaną odpowiedź i zostawiam edytowany tytuł - nie o to prosiłem)

env uruchamia program w zmodyfikowanym środowisku, a następnie odrzuca wszystkie zmiany.

irytacja
źródło
1
Po zdefiniowaniu / wyeksportowaniu do pliku .bashrc działa poprawnie.
huff
1
Jak o THEVAR=/example?
Oleh Prypin
2
Drugi dotyczy zmiennych globalnych, ten nie dodaje takiego ograniczenia. Trzymałbym to osobno.
Lekensteyn,

Odpowiedzi:

569

Aby ustawić zmienną tylko dla bieżącej powłoki:

VARNAME="my value"

Aby ustawić go dla bieżącej powłoki i wszystkie procesy rozpoczęły się od bieżącej powłoki:

export VARNAME="my value"      # shorter, less portable version

Aby ustawić go na stałe dla wszystkich przyszłych sesji bash, dodaj taką linię do swojego .bashrcpliku w $HOMEkatalogu.

Aby ustawić go na stałe i w całym systemie (wszyscy użytkownicy, wszystkie procesy) dodaj zmienną ustawioną w / etc / environment:

sudo -H gedit /etc/environment

Ten plik akceptuje tylko przypisania zmiennych, takie jak:

VARNAME="my value"

Nie używaj exporttutaj słowa kluczowego.

Musisz się wylogować z bieżącego użytkownika i zalogować ponownie, aby nastąpiły zmiany zmiennych środowiskowych.

Michał Šrajer
źródło
29
Shell config files such as ~/.bashrc, ~/.bash_profile, and ~/.bash_login are often suggested for setting environment variables. While this may work on Bash shells for programs started from the shell, variables set in those files are not available by default to programs started from the graphical environment in a desktop session. help.ubuntu.com/community/EnvironmentVariables
SudoSURoot
1
@ Mr.Hyde tak, to chyba rozsądne miejsce
Michał Šrajer
1
@BharadwajRaju, ponieważ w niektórych starych systemach UNIX można eksportować tylko ustawioną zmienną. Na przykład stary Solaris i HP-UX.
Michał Šrajer
1
Po ustawieniu zmiennej środowiskowej, jak mogę ją szybko wyświetlić, aby upewnić się, że jest ustawiona?
Rod
1
@Rodecho $myvar
Qwerty
29

Aby ustawić zmienną środowiskową raz, użyj exportpolecenia w wierszu polecenia, a nie w skrypcie powłoki:

$ export THEVAR=/example

Zmienna zostanie ustawiona na resztę sesji powłoki lub do momentu jej rozbrojenia.

Aby za każdym razem ustawiać zmienną środowiskową, użyj exportpolecenia z .bashrcpliku (lub odpowiedniego pliku inicjalizacji dla twojej powłoki).

Aby ustawić zmienną środowiskową ze skryptu, użyj exportpolecenia w skrypcie, a następnie sourceskryptu. Jeśli wykonasz skrypt, to nie zadziała.

Wyjaśnienie różnicy między pozyskiwaniem a wykonywaniem znajduje się w następującej odpowiedzi: https://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a- bash-script / 176788 # 176788

lesmana
źródło
4
Jak mogę sprawić, by działało tylko poprzez wykonanie skryptu? Bez pozyskiwania.
Mithril,
19

Aby trwale dodać nową zmienną środowiskową w Ubuntu (testowane tylko w 14.04), wykonaj następujące czynności:

  1. Otwórz terminal (naciskając CtrlAltT)
  2. sudo -H gedit /etc/environment
  3. Wpisz swoje hasło
  4. Edytuj właśnie otwarty plik tekstowy:
    np. Jeśli chcesz dodać FOO=bar, po prostu napisz FOO=barw nowym wierszu
  5. Zapisz to
  6. Po zapisaniu wyloguj się i zaloguj ponownie.
  7. Wprowadzono wymagane zmiany.
użytkownik355501
źródło
5
Wyczyściłem twoją odpowiedź, usuwając bardziej niebezpieczne fragmenty na temat sudo gedit(patrz askubuntu.com/questions/270006/… ) i chmod 777. To ostatnie nigdy nie powinno być wykonywane w pliku konfiguracji systemu.
muru
To poprawna odpowiedź w niektórych przypadkach. Wszystkie sesje, niezależnie od tego, czy sesje powłoki użytkownika, czy nie, otrzymają wartość zmiennych ustawionych tutaj. Ważne jest, aby pamiętać, że chociaż może to wyglądać jak skrypt powłoki, nie jest - pozwala tylko ustawić zmienne środowiskowe (zamiast używać funkcji powłoki, takich jak iflub test)
Tom Harrison Jr
Jeśli pasek jest ciągiem, czy powinienem umieścić go między cudzysłowami? Jak Foo="bar"?
blue_chip
@blue_chip Nie, działa bez cudzysłowów.
Kliknij Upvote
4
@blue_chip dla zmiennych środowiskowych, wszystko jest ciągiem. Potrzebujesz cudzysłowu tylko wtedy, gdy zawiera spacje.
Ruslan
8

Aby zmiany środowiska / var zachowały się po zakończeniu skryptu, musisz użyć source ./script.shskrótu lub notacji źródłowej „”.. ./script.sh

Source wykona polecenia w skrypcie tak, jakbyś je wpisał ... więc zmienia niektóre aspekty skryptu, takie jak wyjście ... więc jeśli skrypt sprawdza coś i decyduje się wyjść, jeśli na przykład false, poprzez wywołanie exit 0spowoduje zakończenie bieżącej sesji terminala / powłoki.

m0bl
źródło
Jest to bardzo stare pytanie, które ma już zaakceptowane odpowiedź i kilka innych ... Zastanów się, odpowiadając na nowsze pytania proszę ...
NerdOfCode
3
@NerdOfCode ta odpowiedź rozwiązuje problem, który jest nadal aktualny i żadna z pozostałych odpowiedzi, w tym odpowiedź zaakceptowana, nie wspomina o tym, o ile widzę ... W rzeczywistości dostępne są dwie odznaki zapewniające dobre odpowiedzi na stare pytania, więc jest to zalecane
Zanna
1
Właśnie tego szukałem. Musiałem zobaczyć poza skryptem wyeksportowane zmienne ze skryptu.
albanx
5

Jeśli robisz to za pomocą skryptu, jednym łatwym sposobem na ustawienie zmiennej środowiskowej na stałe jest umieszczenie poniżej instrukcji w skrypcie

if [[ ! -d "$MyVar" ]]; then 
    export MyVar="abc"
    echo 'export MyVar="abc"' >> ~/.bashrc
fi

Jeśli chcesz ocenić wyrażenia takie jak pwd, możesz użyć tego, na przykład,

echo "export EIGEN_ROOT=\"$(pwd)/eigen\"" >> ~/.bashrc
Shital Shah
źródło
1

Wiem, że jest już późno, ale jeśli chcesz dodać zmienną środowiskową dla wszystkich użytkowników (np. Użycie JAVA) - możesz wykonać następujące czynności:

1) Otwórz /etc/bash.bashrcza pomocą nano (możesz używać dowolnego edytora, nie wolę VIM, ponieważ jest to najgorsze, jeśli chodzi o łatwość obsługi - nic osobistego).

2) Dołącz do pliku:

export VAR=path export PATH=$PATH:/bin 3) (Lepiej, jeśli możesz odbić pole) - lub po prostu otwórz nową sesję SSH i potwierdź za pomocą polecenia `env '.

ALE jeśli chcesz, aby każdy użytkownik miał do tego osobne ustawienie, musisz dokonać zmiany (skryptu) w .bashrcpliku w ~/.bashrc(lub /home/$USER/jeśli jesteś nowy w systemach Linux)

ha9u63ar
źródło