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
command-line
bash
python
scripts
GhostCat
źródło
źródło
exit 1
jest przyszłościową drogą. FileNotFoundError musi być spowodowany przez coś innego./bin/false
?Odpowiedzi:
Jeśli szukasz polecenia systemowego, które zawsze zwraca niezerowy kod wyjścia,
/bin/false
wydaje się, że powinno ono działać. Odman false
:źródło
/bin/false 5; echo $?
5
) są ignorowaneMoż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.źródło
exit RETURNCODE
(bez tejbash -c
części)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ę.źródło