Czy wymusić „zły” (nie 0) kod powrotu polecenia terminalu?

8

Mam framework napisany w Pythonie i do celów testowych po prostu chcę zrobić podproces (inaczej wywołanie powłoki) ... który powinien po prostu wrócić z RC! = 0. Próbowałem wywołać jakiś nieistniejący plik wykonywalny; lub uruchomić „exit 1”; ale z jakiegoś powodu są one tłumaczone na FileNotFoundError.

Co więc mogę zrobić, aby uruchomić kod powrotu! = 0 (w „niezawodny” sposób, co oznacza, że ​​polecenie nie powinno nagle zwrócić 0 w przyszłości).

Pomyślałem, aby „wyszukać” plik binarny o nazwie exit, ale cóż:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory
GhostCat
źródło
1
exit 1jest przyszłościową drogą. FileNotFoundError musi być spowodowany przez coś innego.
Jos
Kiedy zrobię „które wyjście” ... nic nie zostanie znalezione. Zakładam więc, że „exit” jest funkcją bash; prawdopodobnie niedostępne, gdy wykonuję połączenie podprocesowe ?!
GhostCat,
Techniczne nitpowanie: niezerowy kod powrotu nie jest przeznaczony do wskazywania złej sytuacji, jak sugeruje twoje pytanie. To, że „0” oznacza „nic złego”, to tylko kwestia konwencji. W rzeczywistości masz 8 bitów informacji, które możesz przekazać z powrotem do procesu połączenia.
Jos
@Jos, rozumiem to. Ale chodzi o to, że RC! = 0 prowadzi do konkretnego wyjątku od subprocess.check_call (). Chcę wymusić ten warunek, aby upewnić się, że jest poprawnie obsługiwany (aby upewnić się, że każda sytuacja RC! = 0 w prawdziwych testach jest obsługiwana tak, jak powinna).
GhostCat,
2
Jak o /bin/false?
steeldriver

Odpowiedzi:

18

Jeśli szukasz polecenia systemowego, które zawsze zwraca niezerowy kod wyjścia, /bin/falsewydaje się, że powinno ono działać. Od man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.
steeldriver
źródło
Nie. Przynajmniej na Ubuntu 16.04.4 z uruchomionym bashem następujący wiersz poleceń podaje 1 zamiast 5:/bin/false 5; echo $?
fviktor
@fviktor wychodzi ze statusem niezerowym - jak mówi streszczenie, argumenty wiersza poleceń (takie jak 5) są ignorowane
steeldriver
Masz rację. Po prostu nie ma sposobu, aby kontrolować rzeczywisty niezerowy kod wyjścia.
fviktor
7

Możesz utworzyć nowy kod powrotu za pomocą polecenia bash -c "exit RETURNCODE", zastępując „RETURNCODE” dowolnym numerem. Zauważ, że zostanie przycięty do 8-bitowej liczby całkowitej bez znaku (0 ... 255) przez (RETURNCODE mod 256)

Możesz sprawdzić kod powrotu ostatniego polecenia powłoki w terminalu (!) Podczas wykonywania echo $?. „$?” zmienna zawiera najnowszy kod powrotu, a „echo” wypisuje go na standardowe wyjście.

Bajt Dowódca
źródło
+1. Zauważ, że jeśli piszesz to w skrypcie powłoki, możesz po prostu zrobić exit RETURNCODE(bez tej bash -cczęści)
Matt Browne
0

Po kilku dalszych testach okazało się, że mój problem nie leży po stronie „Linuksa”.

Python ma moduł shlex; które powinny być użyte do „podziału” ciągów poleceń. Kiedy zmieniłem moje wywołanie podprocesu, aby użyć wyniku shlex.split()wywołania „bash exit 1” daje mi to, czego potrzebuję.

GhostCat
źródło