Pomyślałem więc, że dobrze to rozumiem, ale właśnie przeprowadziłem test (w odpowiedzi na rozmowę, w której nie zgadzałem się z kimś) i stwierdziłem, że moje rozumienie jest błędne ...
Jak bardzo szczegółowo, co dokładnie dzieje się, gdy wykonuję plik w mojej powłoce? Mam na myśli to, że jeśli napiszę : ./somefile some argumentsw mojej powłoce i naciśnie klawisz Return (i somefileistnieje w cwd, a mam uprawnienia do odczytu + wykonywania somefile), to co się stanie pod maską?
Myślałem, że odpowiedź brzmi:
- Powłoka wykonuje polecenie systemowe
exec, przekazując ścieżkę dosomefile - Jądro sprawdza
somefilei sprawdza magiczną liczbę pliku, aby ustalić, czy jest to format obsługiwany przez procesor - Jeśli magiczna liczba wskazuje, że plik ma format, który procesor może wykonać, to
- tworzony jest nowy proces (z wpisem w tabeli procesów)
somefilejest odczytywany / mapowany do pamięci. Tworzony jest stos, a wykonanie przeskakuje do punktu wejścia kodusomefile, zARGVzainicjalizowanym do tablicy parametrów (achar**,["some","arguments"])
- Jeśli magiczna liczba to shebang, to
exec()spawnuje nowy proces jak wyżej, ale użyty plik wykonywalny to interpreter, do którego odwołuje się shebang (np./bin/bashLub/bin/perl) isomefilejest przekazywany doSTDIN - Jeśli plik nie ma prawidłowej magicznej liczby, pojawia się błąd typu „nieprawidłowy plik (zła magiczna liczba): błąd formatu Exec”
Jednak ktoś powiedział mi, że jeśli plik jest zwykłym tekstem, wówczas powłoka próbuje wykonać polecenia (tak jakbym napisał bash somefile). Nie wierzyłem w to, ale po prostu spróbowałem i było to poprawne. Wyraźnie mam więc pewne nieporozumienia na temat tego, co się tu właściwie dzieje i chciałbym zrozumieć mechanikę.
Co dokładnie dzieje się, gdy wykonuję plik w mojej powłoce? (w najdrobniejszych szczegółach jest rozsądne ...)
source somefileróżni się jednak bardzo od nowego procesu, który został opracowany ./somefile.
./somefileże spowoduje to, że bash wykona polecenia, somefilejeśli plik nie będzie miał magicznej liczby. Myślałem, że po prostu wyświetli błąd, a zamiast tego wydaje się być skutecznysource somefile
somefilejest to plik tekstowy, to jeśli spróbuję go uruchomić, pojawi się nowa powłoka. Plik echo $$zachowuje się inaczej, jeśli wykonam go w stosunku do źródła.