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=asdfaktualizuje środowisko, jeśliVARbył już w środowisku. (To nie było ' t prawda w oryginalnej powłoce Bournea.)