Jaka jest różnica między env, setenv, export i kiedy używać?

Niedawno zauważyłem, że mamy 3 opcje ustawiania zmiennych środowiskowych:

  1. export envVar1=1
  2. setenv envVar2=2
  3. 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

  • W nowoczesnych powłokach VAR=asdf aktualizuje środowisko, jeśli VAR był już w środowisku. (To nie było ' t prawda w oryginalnej powłoce Bournea.)

Odpowiedź

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *