Forçar código de retorno “ruim” (não 0) do comando do terminal?

8

Eu tenho uma estrutura escrita em python e, para fins de teste, basicamente quero fazer um subprocesso (também chamado de shell) ... que deve simplesmente retornar com um RC! = 0. Tentei invocar alguns executáveis ​​inexistentes; ou para executar "exit 1"; por algum motivo, esses são traduzidos para um FileNotFoundError.

Portanto, o que mais eu poderia fazer para acionar um código de retorno! = 0 (de uma maneira "confiável"; ou seja, o comando não deve retornar repentinamente 0 em um momento futuro).

Eu pensei em "procurar" por um binário chamado exit, mas bem:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory
GhostCat
fonte
1
exit 1é o caminho a seguir. O FileNotFoundError deve ser causado por outra coisa.
Jos
Quando eu faço "qual saída" ... nada é encontrado. Então, eu assumo que "exit" é uma função bash; provavelmente não está disponível quando eu faço uma chamada de subprocesso ?!
GhostCat
Informações técnicas: um código de retorno diferente de zero não pretende ser uma indicação de uma situação ruim , como parece sugerir sua pergunta. Que "0" significa "nada de errado" é apenas uma questão de convenção. De fato, você tem 8 bits de informação para retornar ao processo de chamada.
Jos
@ Jos, eu entendo isso. Mas o ponto é que um RC! = 0 leva a uma exceção específica de subprocess.check_call (). Quero impor essa condição para garantir que ela seja tratada adequadamente (para garantir que qualquer situação de RC! = 0 em testes reais seja tratada como deveria).
GhostCat
2
Que tal /bin/false?
steeldriver

Respostas:

18

Se você está procurando um comando do sistema que sempre retorna um código de saída diferente de zero, /bin/falseparece que ele deve funcionar para você. De man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.
chave de aço
fonte
Não, não tem. Pelo menos no Ubuntu 16.04.4 rodando o bash o seguinte linha de comando dá 1 em vez de 5:/bin/false 5; echo $?
fviktor
@fviktor ele sai com diferente de zero estado - como a sinopse diz, argumentos de linha de comando (tais como 5) são ignorados
steeldriver
Você está certo. Apenas não há como controlar o código de saída diferente de zero.
Feviktor 2/06
7

Você pode criar um novo código de retorno com o comando bash -c "exit RETURNCODE", substituindo "RETURNCODE" por qualquer número. Observe que ele será aparado em um número inteiro não assinado de 8 bits (0 ... 255) por (RETURNCODE mod 256)

Você pode verificar o código de retorno do último comando do shell dentro do terminal (!) Com a execução echo $?. O "$?" A variável contém o código de retorno mais recente e "eco" o imprime na saída padrão.

Byte Commander
fonte
+1. Note que se você estiver escrevendo isso em um script shell, você pode apenas fazer exit RETURNCODE(sem a bash -cparte)
Matt Browne
0

Após mais alguns testes, descobri que meu problema não estava no lado "Linux".

Python tem um módulo shlex; que deve ser usado para "dividir" cadeias de comando. Quando mudei minha chamada de subprocesso para usar a saída da shlex.split()chamada "saída 1 do bash", obtive o que eu precisava.

GhostCat
fonte