Jakie jest znaczenie wartości zwracanej 127 z $? w UNIX.
291
Wartość 127 jest zwracana, /bin/sh
gdy dane polecenie nie zostanie znalezione w PATH
zmiennej systemowej i nie jest to wbudowane polecenie powłoki. Innymi słowy, system nie rozumie twojego polecenia, ponieważ nie wie, gdzie znaleźć plik binarny, który próbujesz wywołać.
which [program]
aby zobaczyć, który plik binarny używa system operacyjny. Jeśli okaże się pusty, następnym krokiem jest sprawdzenie bitu wykonania i ŚCIEŻKI.which
nie jest szczególnie dokładny - nie zna aliasów, funkcji powłoki, zapamiętywania PATH ani innych czynników wewnętrznych dla stanu powłoki. Znacznie lepiej jest użyćtype
wbudowanej powłoki, która wie o tych wszystkich rzeczach.126
(Permission denied
), nie127
kiedy próbuję wywołać plik wykonywalny (niezależnie od jego zawartości); podobnie próba wykonania katalogu powoduje również126
(is a directory
).Ogólnie oznacza to:
127 - nie znaleziono polecenia
ale może to również oznaczać, że polecenie zostało znalezione ,
ale NIE jest wymagana biblioteka wymagana przez polecenie .
źródło
127 - command not found
przykład: $ caat Komunikat o błędzie będzie
grzmotnąć:
teraz sprawdzasz za pomocą
echo $?
źródło
Konwencja powłoki polega na tym, że pomyślny plik wykonywalny powinien kończyć się wartością 0. Wszystko inne może być interpretowane jako pewnego rodzaju błąd, po części bash lub pliku wykonywalnego, który właśnie uruchomiłeś. Zobacz także $ PIPESTATUS i sekcję EXIT STATUS strony podręcznika bash:
źródło
Nie ma żadnego specjalnego znaczenia, poza tym, że ostatni proces wyjścia zrobił to ze statusem wyjścia 127.
Jednak jest również używany przez bash (zakładając, że używasz bash jako powłoki), aby powiedzieć, że polecenie, które próbowałeś wykonać, nie mogło zostać wykonane (tzn. Nie można go znaleźć). Niestety, nie można go od razu wydedukować, jeśli proces zakończył się statusem 127 lub jeśli nie można go znaleźć.
EDYCJA:
Nie można od razu wydedukować, z wyjątkiem danych wyjściowych na konsoli, ale jest to przepełnienie stosu, więc zakładam, że robisz to w skrypcie.
źródło
Ten błąd jest również mylący. Mówi, że plik nie został znaleziony, mimo że pliki są rzeczywiście obecne. Może to być spowodowane nieprawidłowymi, nieczytelnymi znakami specjalnymi obecnymi w plikach, które mogą być spowodowane przez używany edytor. Ten link może ci w takich przypadkach pomóc.
-bash: ./my_script: / bin / bash ^ M: zły interpreter: Brak takiego pliku lub katalogu
Najlepszym sposobem, aby dowiedzieć się, czy to ten problem, jest proste umieszczenie instrukcji echa w całym pliku i sprawdzenie, czy zgłoszony został ten sam błąd.
źródło
Jeśli próbujesz uruchomić program w języku skryptowym, może być konieczne podanie pełnej ścieżki języka skryptowego i pliku do wykonania. Na przykład:
źródło
Jeśli JCL na komputerze mainframe IBM zawiera dodatkowe znaki lub cyfry na końcu nazwy wywoływanego skryptu unix, może wyrzucić taki błąd.
źródło