¿Forzar el código de retorno "malo" (no 0) del comando de terminal?

8

Tengo un marco escrito en python, y para propósitos de prueba básicamente quiero hacer un subproceso (también conocido como llamada de shell) ... que simplemente debería volver con un RC! = 0. Traté de invocar algún ejecutable no existente; o para ejecutar "salida 1"; pero esos son por alguna razón traducidos a un FileNotFoundError.

Entonces, ¿qué más podría hacer para activar un código de retorno! = 0 (de manera "confiable"; lo que significa que el comando no debería devolver 0 de repente en un momento futuro).

Pensé en "buscar" un binario llamado exit, pero bueno:

> /usr/bin/env exit
/usr/bin/env: exit: No such file or directory
GhostCat
fuente
1
exit 1es el camino a seguir para el futuro. FileNotFoundError debe ser causado por otra cosa.
Jos
Cuando hago "qué salida" ... no se encuentra nada. Así que supongo que "salir" es una función bash; ¡¿Probablemente no esté disponible cuando hago una llamada de subproceso ?!
GhostCat
Selección técnica: un código de retorno distinto de cero no pretende ser una indicación de una mala situación, como parece implicar su pregunta. Que "0" significa "nada malo" es solo una cuestión de convención. De hecho, tiene 8 bits de información para transmitir al proceso de llamada.
Jos
@Jos entiendo eso. Pero el punto es que un RC! = 0 conduce a una excepción específica de subprocess.check_call (). Quiero hacer cumplir esa condición para asegurarme de que se maneja adecuadamente (para asegurarme de que cualquier situación RC! = 0 en pruebas reales se maneje como debería ser).
GhostCat
2
¿Qué tal /bin/false?
steeldriver

Respuestas:

18

Si está buscando un comando del sistema que siempre devuelva un código de salida distinto de cero, /bin/falseparece que debería funcionar para usted. De man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.
conductor de acero
fuente
No, no lo hace. Al menos en Ubuntu 16.04.4 ejecutando bash, la siguiente línea de comando da 1 en lugar de 5:/bin/false 5; echo $?
fviktor
@fviktor sale con un estado distinto de cero - como dice la sinopsis, los argumentos de la línea de comandos (como 5) se ignoran
steeldriver
Tienes razón. Simplemente no hay forma de controlar el código de salida real distinto de cero.
fviktor
7

Puede crear un nuevo código de retorno con el comando bash -c "exit RETURNCODE", reemplazando "RETURNCODE" con cualquier número. Tenga en cuenta que se recortará a un entero sin signo de 8 bits (0 ... 255) mediante (RETURNCODE mod 256)

Puede verificar el código de retorno del último comando de shell dentro del terminal (!) Con la ejecución echo $?. El "$?" La variable contiene el código de retorno más reciente y "echo" lo imprime en la salida estándar.

Byte Commander
fuente
+1. Tenga en cuenta que si está escribiendo esto en un script de shell, puede hacerlo exit RETURNCODE(sin la bash -cparte)
Matt Browne
0

Después de algunas pruebas más, descubrí que mi problema no estaba en el lado de "Linux".

Python tiene un módulo shlex; que debe usarse para "dividir" cadenas de comandos. Cuando cambié mi llamada de subproceso para usar la salida de shlex.split()invocar "bash exit 1" me da lo que necesito.

GhostCat
fuente