Wykonanie następujących czynności z ekranu linii poleceń:
bash -c "v=value; echo $v"
nie wyświetla nic. W porządku? Jak mogę przypisać wartość do zmiennej wewnątrz tego rodzaju wykonania?
bash
environment-variables
Josep Cols
źródło
źródło
Odpowiedzi:
W grę wchodzą dwie muszle:
Powołanie wywołujące, interaktywna powłoka, z której ją uruchamiasz
Powłoka niezalogowana, nieinteraktywna, spawnowana przez
bash -c
Problem polega na tym, że w podwójnych cudzysłowach zmienne są rozwijane do odpowiednich wartości, dotyczy to każdej powłoki.
Tak więc, ponieważ użyłeś podwójnych cudzysłowów, rozwinięcie zmiennej
$v
ma miejsce w wywołującej powłoce, a nie w wywoływanej powłoce. Ale deklaracjav=value
ma miejsce w tak zwanej nieinteraktywnej powłoce.Tak więc w sumie masz zmienną zdefiniowaną w wywoływanej powłoce i rozwiniętą (wcześniej) w wywołującej powłoce. Ponieważ zmienna wartości nie jest ustawiona w powłoce wywołującej, dlatego nic nie otrzymujesz w wyniku.
Teraz, aby definicja i rozwinięcie zmiennej miało miejsce w odrodzonej powłoce, użyj pojedynczych cudzysłowów lub naciśnij klawisz Escape
$
:źródło
Z podwójnymi cudzysłowami
$v
zostaje zastąpiony przez interaktywną powłokę. Użyj pojedynczych cytatów:źródło