. executable
Składnia nie współpracuje z byle wykonywalny (lub nie?). Zamiast tego jest to alias dla source
wbudowanej wersji bash . Różnica dotyczy głównie skryptów bash, a prawda jest taka, że są to zupełnie różne rzeczy :)
./executable
prosi o uruchomienie pliku wykonywalnego „normalnie”. ./
jest względnym odniesieniem do bieżącej ścieżki. Dzięki temu powłoka (bash) nie będzie próbowała zlokalizować pliku wykonywalnego w katalogu w swoim katalogu $PATH
(co zrobiłoby to, gdyby komenda nie określiła ścieżki). Powodem, dla którego nie możesz tego zrobić, executable
jest bezpieczeństwo; wyobraź sobie, że rozpakowałeś pobrane archiwum, które zawiera złośliwą wersję ls
. Gdyby działał bezpośrednio z bieżącego katalogu, uruchomiłbyś tę wersję, nie zdając sobie z tego sprawy.
Z drugiej strony . executable
mówi „źródłowy plik o nazwie executable
”. Ponieważ bezpośrednio nazywasz ten plik i tak naprawdę nie musi to być plik wykonywalny, ograniczenie bezpieczeństwa dla $ PATH nie ma zastosowania. Sourcing będzie „uruchamiał” (lub wydaje się, że uruchamia) skrypty powłoki. Co to robi:
source filename [arguments]
Read and execute commands from filename in the current shell
environment and return the exit status of the last command exe‐
cuted from filename.
Więc ... Jaka jest naprawdę różnica między wykonywaniem a pozyskiwaniem? Zakładając ten sam skrypt powłoki, wykonanie go ( ./script
) spowoduje odrodzenie nowej powłoki, uruchomienie skryptu wewnątrz tej powłoki, a kiedy skrypt zakończy działanie, zamknij tę powłokę i powróć do powłoki macierzystej. W efekcie rozpocznie nowy bash
proces wykonywania skryptu).
( . script
) spowoduje, że bieżąca powłoka będzie czytać polecenia z pliku tak, jakby były wpisywane w wierszu poleceń. Nie pojawiła się nowa powłoka.
Bardzo łatwym sposobem na sprawdzenie, jak się to zachowuje, jest napisanie skryptu zawierającego tylko exit
. Jeśli ./script
nie, nic nie wydaje się stało, to dlatego, że nowy proces powłoki rozpoczyna się, gdy exit
wychodzi dowodzenia, że nowa powłoka i aktualna powłoka jest nienaruszona.
Jeśli tak . script
, bieżący terminal zostanie zamknięty, ponieważ exit
polecenie działa w bieżącej powłoce. Odpowiada to wpisywaniu exit
w wierszu polecenia.