Forza il codice di ritorno "cattivo" (non 0) del comando terminale?


8

Ho un framework scritto in Python, e per scopi di test sostanzialmente voglio fare un sottoprocesso (aka shell call) ... che dovrebbe semplicemente tornare con un RC! = 0. Ho provato a invocare un eseguibile inesistente; o per eseguire "exit 1"; ma quelli sono per qualche motivo tradotti in un FileNotFoundError.

Quindi, cos'altro potrei fare per attivare un codice di ritorno! = 0 (in modo "affidabile"; ciò significa che il comando non dovrebbe restituire improvvisamente 0 in un momento futuro).

Ho pensato di "cercare" un binario chiamato exit, ma bene:

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

1
exit 1è la strada a prova di futuro. FileNotFoundError deve essere causato da qualcos'altro.
Jos

Quando faccio "quale uscita" ... non viene trovato nulla. Quindi presumo che "exit" sia una funzione bash; probabilmente non disponibile quando eseguo una chiamata di sottoprocesso ?!
GhostCat

Il nitpicking tecnico: un codice di ritorno diverso da zero non è inteso come un'indicazione di una brutta situazione, come sembra implicare la tua domanda. Che "0" significhi "niente di sbagliato" è solo una questione di convenzioni. In effetti hai 8 bit di informazioni da riportare al processo di chiamata.
Jos

@Jos lo capisco. Ma il punto è che un RC! = 0 porta a un'eccezione specifica da subprocess.check_call (). Voglio far valere questa condizione per assicurarmi che sia gestita correttamente (per assicurarsi che qualsiasi situazione RC! = 0 nei test reali sia gestita come dovrebbe essere).
GhostCat

2
Che ne dici /bin/false?
steeldriver,

Risposte:


18

Se stai cercando un comando di sistema che restituisca sempre un codice di uscita diverso da zero, allora /bin/falsesembra che dovrebbe funzionare per te. Da man false:

NAME
       false - do nothing, unsuccessfully

SYNOPSIS
       false [ignored command line arguments]
       false OPTION

DESCRIPTION
       Exit with a status code indicating failure.

No non lo fa. Almeno su Ubuntu 16.04.4 che esegue bash la seguente riga di comando fornisce 1 anziché 5:/bin/false 5; echo $?
fviktor

@fviktor esce con uno stato diverso da zero - come dice la sinossi, gli argomenti della riga di comando (come 5) vengono ignorati
steeldriver

Hai ragione. Non c'è modo di controllare l'attuale codice di uscita diverso da zero.
fviktor,

7

È possibile creare un nuovo codice di ritorno con il comando bash -c "exit RETURNCODE", sostituendo "RETURNCODE" con qualsiasi numero. Si noti che verrà tagliato a un numero intero senza segno a 8 bit (0 ... 255) da (RETURNCODE mod 256)

È possibile controllare il codice di ritorno dell'ultimo comando shell all'interno del terminale (!) Con l'esecuzione echo $?. I "$?" La variabile contiene il codice di ritorno più recente e "echo" lo stampa sull'output standard.


+1. Nota che se stai scrivendo questo in uno script di shell, puoi farlo exit RETURNCODE(senza la bash -cparte)
Matt Browne,

0

Dopo alcuni altri test, ho scoperto che il mio problema non era sul lato "Linux".

Python ha un modulo shlex; che dovrebbe essere usato per "dividere" le stringhe di comando. Quando ho cambiato la mia chiamata al sottoprocesso per usare l'output del richiamo di shlex.split()"bash exit 1" mi dà ciò di cui ho bisogno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.