bash -c „v = wartość; echo $ v ”nie wyświetla nic

Odpowiedzi:

18

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 $vma miejsce w wywołującej powłoce, a nie w wywoływanej powłoce. Ale deklaracja v=valuema 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
heemayl
źródło
1

Z podwójnymi cudzysłowami $vzostaje zastąpiony przez interaktywną powłokę. Użyj pojedynczych cytatów:

$ bash -c 'v=value;echo $v'
value

źródło