Niedawno zauważyłem, że mamy 3 opcje ustawiania zmiennych środowiskowych:
-
export envVar1=1
-
setenv envVar2=2
-
env envVAr3=3
Jeśli istnieją inne sposoby, proszę nas oświecić.
Kiedy powinienem preferować jeden nad drugim? Proszę zasugerować wytyczne.
Jeśli chodzi o zgodność powłoki, która jest najbardziej ekspansywna (obejmuje więcej dialektów powłoki)?
Już zauważyłem to odpowiedź , ale chcę rozszerzyć pytanie o env
i wskazówki dotyczące preferencji użycia.
Odpowiedź
export VARIABLE_NAME="some value"
to sposób na ustawienie zmiennej środowiskowej w dowolnej powłoce zgodnej z POSIX (sh
, dash
, bash
, ksh
itd .; także zsh). Jeśli zmienna ma już wartość, możesz użyć export VARIABLE_NAME
, aby uczynić ją zmienną środowiskową bez zmiany jej wartości.
Pre-POSIX Powłoki Bournea tego nie obsługiwały, dlatego„ zobaczysz skrypty, które unikają export VARIABLE_NAME="some value"
i używają VARIABLE_NAME="some value"; export VARIABLE_NAME
. Ale powłoki Bournea sprzed POSIX są obecnie niezwykle rzadkie.
setenv VARIABLE_NAME="some value"
to składnia csh do ustawiania zmiennej środowiskowej. setenv
nie istnieje w sh, a csh jest niezwykle rzadko używane w skryptach i zostało zastąpione przez bash do interaktywnego użytku przez ostatnie 20 lat (a zsh nawet dłużej), więc możesz o tym zapomnieć, chyba że napotkasz to.
Polecenie env
jest bardzo rzadko przydatne, z wyjątkiem linii shebang . Wywołane bez argumentów wyświetla środowisko, ale export
robi to lepiej (posortowane i często cytowane do disambigua te znaki nowej linii w wartościach z nowych linii, które oddzielają wartości). Po wywołaniu z argumentami uruchamia polecenie z dodatkowymi zmiennymi środowiskowymi, ale to samo polecenie bez env
działa również (VAR=value mycommand
działa również mycommand
z VAR
ustawionym na value
, tak jak env VAR=value mycommand
). Powodem, dla którego env
jest użyteczne w linii shebang, jest to, że wykonuje wyszukiwanie PATH
i zdarza się, że nie robi nic więcej po wywołaniu z poleceniem Nazwa. Polecenie env
może być przydatne do uruchamiania polecenia z kilkoma zmiennymi środowiskowymi z -i
lub bez parametrów, aby wyświetlić środowisko zawierające zmienne z nieprawidłowymi nazwami, których powłoka nie „nie importuje.
Odpowiedź
Ustawienie zmiennej, takiej jak VAR="asdf"
pozostawia środowisko niezmodyfikowane, co oznacza, że programy uruchamiane w tej samej sesji nie będą wiedzieć nic o VAR
i nie będą mogły uzyskać do niego dostępu. Takie zachowanie chcesz zachować podczas pisania skryptów powłoki .
export
z drugiej strony jest wbudowanym bash, który modyfikuje środowisko, dzięki czemu wyeksportowana zmienna jest widoczna dla procesów potomnych uruchomionych w bieżącej sesji. można osiągnąć to samo, uruchamiając VAR="asdf" %program_name%
.
env
nie jest programem wbudowanym, ale programem samym w sobie. Włącz powierzchni działa dokładnie tak, jak wtedy, gdy VAR="asdf" %program_name%
, ale na niższych poziomach sprawy stają się trochę bardziej skomplikowane. Najpierw zostaje uruchomiony env
. Modyfikuje środowisko, a następnie wykonuje polecenie z podanymi argumentami. To samo zachowanie można osiągnąć we własnym kodzie, używając wywołania systemowego exec (3) .
setenv
jest po prostu export
w powłokach z rodziny csh, jak stwierdzono w Twojej odpowiedzi.
Komentarze
Odpowiedź
Jest kilka pytań z odpowiedziami, które odpowiadają na to:
-
Różnica między zmiennymi powłoki, które są eksportowane, a tymi, które nie są w bash
-
Jaka jest różnica w użyciu między zmiennymi powłoki a zmiennymi środowiskowymi?
(itp.)
VAR=asdf
aktualizuje środowisko, jeśliVAR
był już w środowisku. (To nie było ' t prawda w oryginalnej powłoce Bournea.)