Krótka odpowiedź
Uruchom skrypt za pomocą sourcelub .:
source ./script_name.sh
lub
. ./script_name.sh
Ta ostatnia jest nieco bardziej kompatybilna w różnych powłokach.
Długa odpowiedź
To pytanie podkreśla ważną kwestię: skrypty powłoki są uruchamiane w ich własnym kontekście. Aby zobaczyć, co to oznacza, rozważ następujący skrypt powłoki:
#!/bin/bash
cd /
ls
Jeśli to uruchomisz, otrzymasz wynik podobny do tego:
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
Zauważysz jednak, że po uruchomieniu skryptu nadal znajdujesz się w dowolnym katalogu, w którym byłeś przed uruchomieniem: cd /wnętrze skryptu tak naprawdę nie wpłynęło na twoją sesję - wpłynęło tylko na kontekst, w którym skrypt był uruchomiony, w którym jest tworzony w celu uruchomienia skryptu i niszczony po powrocie.
sourceKomenda „do odczytu i wykonywania poleceń z argumentem pliku w bieżącym kontekście powłoki”, więc wszelkie polecenia, takie jak cdwewnątrz niego wpłynie na bieżącą sesję. Gdybyś uruchomił powyższy skrypt, przekazując go source, zobaczyłbyś, że skończy się w katalogu głównym po jego uruchomieniu.
W takim przypadku problem polega na tym, że historypolecenie udostępnia historię bieżącego kontekstu powłoki; kontekst powłoki, w którym skrypt działa bez użycia, sourcenie ma historii, więc nie zapisuje niczego w pliku wyjściowym. Jeśli sourcego użyjesz , uruchomi się we właściwym kontekście i będzie działał zgodnie z oczekiwaniami.
Uwaga: sourcejest wbudowanym poleceniem powłoki, a nie programu per se - w bash, sourcejest synonimem ., ale w niektórych muszli tylko .zadziała - Użyłem sourcew tej odpowiedzi, ponieważ jest to łatwiejsze do odczytania niż ., ale dla maksymalnej kompatybilności, .powinien być użytym.