127 Kod zwrotny od $?

291

Jakie jest znaczenie wartości zwracanej 127 z $? w UNIX.

Sachin Chourasiya
źródło

Odpowiedzi:

428

Wartość 127 jest zwracana, /bin/shgdy dane polecenie nie zostanie znalezione w PATHzmiennej 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ć.

Oldskool
źródło
55
Dzieje się tak również wtedy, gdy skrypt bash nie ma trybu „+ x”, ale rzeczywiście istnieje.
MatthewKremer
3
Możesz spróbować użyć, 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.
four43
10
@ cr125rider, whichnie 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ć typewbudowanej powłoki, która wie o tych wszystkich rzeczach.
Charles Duffy,
5
Zdarzyło mi się to również w przypadku pliku z kanałami Windows. Korekta zakończeń linii do formatu unix rozwiązała problem
Mitkins,
4
@MatthewKremer: W rzeczywistości otrzymuję 126( Permission denied), nie 127kiedy próbuję wywołać plik wykonywalny (niezależnie od jego zawartości); podobnie próba wykonania katalogu powoduje również 126( is a directory).
mklement0
58

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 .

okigan
źródło
14

127 - command not found

przykład: $ caat Komunikat o błędzie będzie

grzmotnąć:

caat: nie znaleziono polecenia

teraz sprawdzasz za pomocą echo $?

Anitha Mani
źródło
10

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.
apbianco
źródło
8

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.

falstro
źródło
2

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.

Rama Sastry
źródło
1

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');
Nacięcie
źródło
Dzięki, to zadziałało dla mnie. Więc zrobiłem które gs, a następnie użyłem ścieżki wyjściowej w moim skrypcie. Pracował ..
Juan
0

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.

Smart Coder
źródło