Jakie jest znaczenie wartości zwracanej 127 z $? w UNIX.
Jakie jest znaczenie wartości zwracanej 127 z $? w UNIX.
Odpowiedzi:
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
), nie 127
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
).
127 - command not found
przykład: $ caat Komunikat o błędzie będzie
grzmotnąć:
caat: nie znaleziono polecenia
teraz sprawdzasz za pomocą echo $?
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:
For the shell’s purposes, a command which exits with a zero exit status has succeeded. An exit status of zero indicates success. A non-zero exit status indicates failure. When a command terminates on a fatal signal N, bash uses the value of 128+N as the exit status.
If a command is not found, the child process created to execute it returns a status of 127. If a com-
mand is found but is not executable, the return status is 126.
If a command fails because of an error during expansion or redirection, the exit status is greater than
zero.
Shell builtin commands return a status of 0 (true) if successful, and non-zero (false) if an error
occurs while they execute. All builtins return an exit status of 2 to indicate incorrect usage.
Bash itself returns the exit status of the last command executed, unless a syntax error occurs, in
which case it exits with a non-zero value. See also the exit builtin command below.
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.
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.
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:
exec('/usr/local/bin/node /usr/local/lib/node_modules/uglifycss/uglifycss in.css > out.css');
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.