Принудительно «неверный» (не 0) код возврата команды терминала?

8

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

Итак, что еще я мог сделать, чтобы вызвать код возврата! = 0 («надежным» способом; это означает, что команда не должна внезапно возвращать 0 в будущем).

Я подумал «искать» двоичный файл с именем exit, но хорошо:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory
GhostCat
источник
1
exit 1это перспективный путь. Ошибка FileNotFoundError должна быть вызвана чем-то другим.
Йос
Когда я делаю "какой выход" ... ничего не найдено. Поэтому я предполагаю, что «выход» - это функция bash; вероятно, недоступно, когда я делаю вызов подпроцесса ?!
GhostCat
Технический придирчивость: ненулевой код возврата не предназначен для указания плохой ситуации, как кажется из вашего вопроса. То, что «0» означает «ничего плохого», это просто вопрос соглашения. На самом деле у вас есть 8 бит информации для передачи обратно в вызывающий процесс.
Йос
@ Я так понимаю. Но дело в том, что RC! = 0 приводит к определенному исключению из subprocess.check_call (). Я хочу применить это условие, чтобы убедиться, что оно правильно обрабатывается (чтобы убедиться, что любая ситуация RC! = 0 в реальных тестах обрабатывается так, как должно быть).
GhostCat
2
Как насчет /bin/false?
стальная водитель

Ответы:

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.
steeldriver
источник
Нет. По крайней мере, в 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 $?. "$?" переменная содержит самый последний код возврата и «echo» выводит его на стандартный вывод.

Byte Commander
источник
+1. Обратите внимание, что если вы пишете это в сценарии оболочки, вы можете просто сделать exit RETURNCODE(без bash -cчасти)
Мэтт Браун
0

После еще одного тестирования я обнаружил, что моя проблема не в стороне от Linux.

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

GhostCat
источник