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 arguments
w mojej powłoce i naciśnie klawisz Return (i somefile
istnieje 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
somefile
i 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)
somefile
jest odczytywany / mapowany do pamięci. Tworzony jest stos, a wykonanie przeskakuje do punktu wejścia kodusomefile
, zARGV
zainicjalizowanym 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/bash
Lub/bin/perl
) isomefile
jest 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 somefile
różni się jednak bardzo od nowego procesu, który został opracowany ./somefile
.
./somefile
że spowoduje to, że bash wykona polecenia, somefile
jeś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
somefile
jest 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.