Krótka odpowiedź
Uruchom skrypt za pomocą source
lub .
:
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.
source
Komenda „do odczytu i wykonywania poleceń z argumentem pliku w bieżącym kontekście powłoki”, więc wszelkie polecenia, takie jak cd
wewną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 history
polecenie udostępnia historię bieżącego kontekstu powłoki; kontekst powłoki, w którym skrypt działa bez użycia, source
nie ma historii, więc nie zapisuje niczego w pliku wyjściowym. Jeśli source
go użyjesz , uruchomi się we właściwym kontekście i będzie działał zgodnie z oczekiwaniami.
Uwaga: source
jest wbudowanym poleceniem powłoki, a nie programu per se - w bash, source
jest synonimem .
, ale w niektórych muszli tylko .
zadziała - Użyłem source
w tej odpowiedzi, ponieważ jest to łatwiejsze do odczytania niż .
, ale dla maksymalnej kompatybilności, .
powinien być użytym.