Potrzebuję wyjaśnień dotyczących sposobu uruchamiania plików wykonywalnych pod terminalem. To może być kiepskie pytanie, ale jaka jest różnica między uruchomieniem pliku wykonywalnego za pomocą ./an_executable
i . an_executable
(załóżmy, że znajdujemy się w katalogu, w którym znajduje się plik wykonywalny )
Wiem już, że ten pierwszy sprawia, że powłoka szuka w pliku bieżącym ( .
) polecenia do wykonania, ale dlaczego nie jest /
potrzebny po .
użyciu drugiej wersji?
Z góry dziękuję.
command-line
executable
zipzap
źródło
źródło
Odpowiedzi:
. executable
Składnia nie współpracuje z byle wykonywalny (lub nie?). Zamiast tego jest to alias dlasource
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 nazwieexecutable
”. 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: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 nowybash
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ę, gdyexit
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 wpisywaniuexit
w wierszu polecenia.źródło
ls
dane wyjściowe: wpisujesz polecenie, uruchamia się, pokazuje dane wyjściowe, a następnie się kończy, ale dane wyjściowe pozostają w terminalu.bash
działającą w nim powłokę. Jeśli wpiszeszbash
, uruchomisz kolejną powłokę; do pierwszej powłoki, to tylko program do uruchomienia. Jeśli wpiszeszexit
, zamkniesz ostatnią powłokę, którą uruchomiłeś, ale nadal będziesz w pierwszej powłoce (tej od momentu uruchomienia terminalu). Znowu to wszystko dzieje się w tym samym terminalu.