Jest różnica między zmienną a zmienną środowiskową. Jeśli wykonasz . foo.sh
i foo.sh
zawiera wiersz FOO=value
, to zmienna FOO
zostanie przypisana w bieżącym procesie. To nie jest zmienna środowiskowa. Aby stać się zmienną środowiskową (a przez to być dostępną do podrzędnych powłok), musi zostać wyeksportowane. Jednakże, muszle zapewniają opcję co sprawia, że wszystkie zadania zmienne promować zmiennej do zmiennej środowiskowej, więc jeśli po prostu zrobić:
set -a
. foo.sh
set +a
wtedy wszystkie przypisania zmiennych w foo.sh będą zmienne środowiskowe w bieżącym procesie. Zauważ, że nie jest to ściśle prawdą: w bashie wyeksportowanie zmiennej sprawia, że jest to zmienna środowiskowa w bieżącej powłoce, ale w innych powłokach (np. Kreska) eksportowanie zmiennej nie czyni jej zmienną środowiskową w bieżącej powłoce. (To powoduje, że należy ustawić go w środowisku podpowłok jednak).
stworzyłem kolejny bar.sh skryptu, który ma źródłowy foo.sh podczas odczytu linia; do eksportuj "$ line" done
user2077092
Musisz też "source bar.sh" również wpłynąć na bieżące środowisko. – chepner
Również pętla 'while' jest zamiast' source foo.sh'; nie potrzebujesz obu. To nie jest złe, po prostu zbędne. – chepner