2013-07-03 22 views
7

Ho uno script che controlla lo stato di uscita la seguente funzione:Come si verifica uno stato di uscita diverso da zero di un comando in Bash?

function is_git_repository {              
    git branch &> /dev/null              
} 

che restituisce 0 se siete in un repo git, e 128 se non sei.

Non ho problemi di test per vedere se il valore restituito è 0; le seguenti opere come previsto:

if is_git_repository ; then 
    echo you are in a git repo 
else 
    echo you are NOT in a git repo 
fi 

Ma è quando sto cercando di verificare uno stato di uscita che è diverso da 0 quando sono in esecuzione in problemi. Ho provato quanto segue, ma nessuno di loro lavoro:

  1. if [[ "$(is_git_repository)" != "0" ]] ; ... restituisce sempre true (link)
  2. if [[ "$(is_git_repository)" -ne "0" ]] ; ... restituisce sempre falso
  3. if [[ "$(is_git_repository)" != 0 ]] ; ... restituisce sempre true
  4. if [[ "$(is_git_repository)" -ne 0 ]] ; ... restituisce sempre false
  5. if [[ ! "$(is_git_repository)" ]] ; ... valuta sempre true
  6. if !is_git_repository ; ... fa solo eco alla c ritorno a me, ma senza il botto (wtf?)

Qual è il modo corretto per verificare uno stato di uscita diverso da zero di un comando in un'istruzione if?

+1

Lei sembra essere alla ricerca di $? – devnull

+0

La "fonte" a cui ti sei collegato non era né la risposta accettata né la risposta più votata per la domanda. –

risposta

7

presto ho capito che if ! is_git_repository ; then ... lavori come previsto (guardare sotto 7.1.2.1. Test stato di uscita in Introduction to if), ma perché? Mi sarei aspettato che il # 1 funzionasse almeno, ma non so perché non lo faccia.

Inoltre, che succede con # 6 ?!

+3

Quando si dice "$ (is_git_repository)" 'si ottiene indietro * lo standard output * del comando, non lo * stato di uscita *. Reindirizza stdout e stderr, quindi è sempre la stringa vuota che non è sempre uguale alla stringa "0". bash è sensibile agli spazi bianchi, quindi '!' deve stare da solo. Come cita @devnull, se vuoi lo stato di uscita hai bisogno della variabile '$?'. –

+0

@glennjackman Grazie! Questo lo spiega. Che dire di quelli con '-ne' però? Perché vengono valutati in modo diverso rispetto a quelli con '! ='? (es. perché una stringa vuota "uguale" a "0"/0 con '-ne' ma non uguale a" 0 "/ 0 con'! = '?) – 3cheesewheel

+1

L'[aritmetica della shell] (http: // www. gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic) la sezione del manuale dice: "Un valore nullo si valuta su 0." –

1

consideri scorciatoia booleano invece di un if dichiarazione:

is_git_repository || echo you are NOT in a git repo 
Problemi correlati