Примусити "поганий" (не 0) код повернення термінальної команди?


8

У мене є структура, написана в python, і для цілей тестування я в основному хочу зробити підпроцес (він же виклик оболонки) ... який повинен просто повернутися з RC! = 0. Я намагався викликати деякі неіснуючі виконувані файли; або запустити "вихід 1"; але вони чомусь перекладаються на FileNotFoundError.

Отже, що ще я можу зробити, щоб запустити код повернення! = 0 ("надійним" способом; значить, команда не повинна раптом повертати 0 в майбутньому моменті).

Я думав "шукати" двійковий код, який називається вихід, але добре:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory

1
exit 1це надійний майбутній шлях. ФайлNotFoundError повинен бути викликаний чимось іншим.
Жос

Коли я роблю "який вихід" ... нічого не знайдено. Тож я припускаю, що "вихід" - це баш-функція; напевно, недоступний, коли я здійснюю виклик підпроцесу ?!
GhostCat

Технічне винищування: ненульовий код повернення не є ознакою поганої ситуації, як видно з вашого запитання. Те, що "0" означає "нічого поганого", є лише питанням конвенції. Насправді у вас є 8 біт інформації, щоб повернутись до процесу виклику.
Jos 12

@Jos Я це розумію. Але справа в тому, що RC! = 0 призводить до конкретного винятку з subprocess.check_call (). Я хочу застосувати цю умову, щоб забезпечити її належну обробку (щоб переконатися, що будь-яка ситуація RC! = 0 в реальних тестах обробляється як належить).
GhostCat

2
Як щодо /bin/false?
steeldriver

Відповіді:


18

Якщо ви шукаєте системну команду, яка завжди повертає ненульовий код виходу, то, /bin/falseздається, вона повинна працювати для вас. Від man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.

Ні, це не є. Принаймні на Ubuntu 16.04.4, що працює bash, наступний командний рядок дає 1 замість 5:/bin/false 5; echo $?
fviktor

@fviktor він закінчується з ненульовим статусом - як говорить конспект, аргументи командного рядка (такі як 5) ігноруються
steeldriver

Ти правий. Просто не можна контролювати фактичний ненульовий код виходу.
fviktor

7

Ви можете створити новий код повернення за допомогою команди bash -c "exit RETURNCODE", замінивши "RETURNCODE" на будь-яке число. Зауважте, що вона буде оброблена 8-бітовим цілим числом без підпису (0 ... 255) (RETURNCODE mod 256)

Ви можете перевірити код повернення останньої команди оболонки всередині терміналу (!) Виконанням echo $?. Значення "$?" змінна містить останній код повернення і "ехо" друкує його до стандартного виводу.


+1. Зауважте, що якщо ви пишете це в сценарії оболонки, ви можете просто обійтися exit RETURNCODE(без bash -cчастини)
Метт Браун

0

Після ще кількох тестувань я виявив, що моя проблема не в стороні "Linux".

У Python є модуль shlex; який слід використовувати для "розділення" командних рядків. Коли я змінив свій виклик підпроцесору, щоб використовувати результат shlex.split()виклику "bash exit 1", дає мені те, що мені потрібно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.