Po uruchomieniu set -a var=99
mogę znaleźć zdanie w wynikach set
:
...
TERM=xterm
UID=0
USER=root
VIRTUAL_ENV_DISABLE_PROMPT=1
_=var=99
colors=/etc/DIR_COLORS
...
Czy ktoś mógłby mi powiedzieć, co oznacza „_ =”?
Zauważam, że echo $var
nic nie da. Jeśli uruchomię set -a
, set
to zmienna nie będzie zawierać tej zmiennej. Co się dzieje?
Odpowiedzi:
Kiedy wykonujesz
set -a var=99
, zdarzają się trzy różne rzeczy (związane z twoim pytaniem):-a
) (odwróć wykonującset +a
), aby wyeksportować zmienne.$1
ustawione navar=99
).$_
jest ustawiane na ostatni parametr (rozwinięty).zestaw -a
Wykonanie
set -a
oznacza wszystkie wyeksportowane zmienne (nowe lub zmienione) (we wszystkich powłokach, z wyjątkiemcsh
niektórych powłok pokrewnych).Aby odzyskać z tego ustawienia, wystarczy zmienić
-
Do+
:ustaw var = 99
Tak naprawdę powinno być,
set -- var=99
aby uniknąć interpretacji opcji (a zestaw ma dużo) z wartościami rozpoczynającymi się od myślnika (-
).Ustawia listę argumentów (listę parametrów pozycyjnych) na tę po
--
. Jest to ważne we wszystkich rozsądnych powłokach (nie w csh i in.). Argumenty pozycyjne są drukowane z „$ @” (lub podobnym „$ *”, nie równym)._ = ostatni_argument
A wartość wewnętrznej zmiennej powłoki
_
zmienia się na ostatni argument wykonywanego wiersza. To jest nie prawda, w prawie wszystkich muszli (JSH, jesion, Yash, myślnik, lksh, mksh, ksh93, attsh i csh tcsh) oraz oczywiście z wyjątkiem bash.Należy pamiętać, że wartość w
$_
to wartość po rozwinięciu:Dlatego po wykonaniu:
Otrzymasz opis zmiennej powłoki „$ _”. Działa to również:
źródło
Podkreślenie jest w rzeczywistości specjalną zmienną powłoki. To, co widzisz tutaj, to
_
zmienna podkreślenia ( ) o wartościvar=99
. Jest tylko do odczytu i jest utrzymywany przez powłokę. To jest:Twój przykład należy do drugiej kategorii. Wpisałeś:
Więc ostatni argument nie było
var=99
, i że była wartość zostałeś ustawienie (nie zostały ustalonevar
do99
). Dlatego_
zostało to ustawione. I to jest zgłaszane:Jest to trochę mylące, ale pierwszy
=
wskazuje przypisanie do zmiennej_
, a drugi jest częścią wartości.Warto również wspomnieć, że
-a
opcjaset
spowoduje, że wszystkie później zdefiniowane zmienne zostaną wyeksportowane.źródło
Prawidłowa odpowiedź zależy od używanej powłoki:
bash
, cokolwiek @BobEager powiedział, ma zastosowaniezsh
, to jest ustawiony tylko na ostatni argument poprzedniego polecenia, a do pełnej ścieżki polecenia w środowisku komendy zadash
ustawiają tę zmienną tylko podczas uruchamiania sesji interaktywnejMogą istnieć także inne cechy szczególne innych powłok. Jako taki nie
$_
jest zdefiniowany w POSIX, dlatego należy pamiętać o potencjalnych problemach z przenośnością podczas jego używania.Uwaga dodatkowa: jeśli Twoim celem jest przypisanie wartości 99
var
i udostępnienie jej w środowisku kolejnych podprocesów, poprawna składnia, aby to osiągnąć, to:źródło
unset var;set -a; var=99
. Działa we wszystkich rezonansowych powłokach (nie csh i in.).W niezbyt dobrym druku bash (1) znajdujemy
Co oznacza,
set -a var=99
że nie ustawia zmiennej środowiskowejvar
na99
; ustawia się$1
navar=99
. Spróbujecho "$1"
lubecho "$*"
zobaczysz.źródło