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?
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?
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 deklaracja v=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 $
:
$ bash -c "v=value; echo $v"
$ bash -c 'v=value; echo $v'
value
$ bash -c "v=value; echo \$v"
value
Z podwójnymi cudzysłowami $v
zostaje zastąpiony przez interaktywną powłokę. Użyj pojedynczych cytatów:
$ bash -c 'v=value;echo $v'
value