2013-07-03 22 views
7

Mam skrypt, który sprawdza stan wyjścia z następujących funkcji:Jak przetestować niezerowy status wyjścia polecenia w Bash?

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

która zwraca 0 jeśli jesteś w repo git i 128 jeśli nie jesteś.

Nie mam problemu z testowaniem, aby sprawdzić, czy zwracana wartość to 0; następujące prace zgodnie z oczekiwaniami:

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

Ale gdy próbuję przetestować dla stanu wyjścia, który jest niczym innym niż 0 kiedy używam do problemów. Próbowałem następujących, ale żaden z nich nie działa:

  1. if [[ "$(is_git_repository)" != "0" ]] ; ... zawsze ma wartość true (link)
  2. if [[ "$(is_git_repository)" -ne "0" ]] ; ... zawsze FALSE
  3. if [[ "$(is_git_repository)" != 0 ]] ; ... zawsze wartość true
  4. if [[ "$(is_git_repository)" -ne 0 ]] ; ... zawsze ocenia się false
  5. if [[ ! "$(is_git_repository)" ]] ; ... zawsze jest prawdziwe
  6. if !is_git_repository ; ... tylko echa c ommand z powrotem do mnie, ale bez huku (wtf?)

Jaki jest poprawny sposób sprawdzenia niezerowego statusu wyjścia polecenia w instrukcji if?

+1

Wydajesz się szuka $? – devnull

+0

"Źródło", z którym się łączyłeś, nie było ani zaakceptowaną, ani najwyższą odpowiedzią na to pytanie. –

Odpowiedz

7

wkrótce zorientowali się, że if ! is_git_repository ; then ... działa zgodnie z przeznaczeniem (patrz pod 7.1.2.1. Testowanie status wyjścia w Introduction to if), ale dlaczego? Spodziewałbym się, że # 1 zadziała co najmniej, ale nie wiem, dlaczego tak nie jest.

Co się dzieje z # 6 ?!

+3

Gdy powiesz '' $ (is_git_repository) "' otrzymasz * standardowe wyjście * polecenia, a nie * status wyjścia *. Przekierowujesz standardowe wyjście i stderr, więc zawsze jest to pusty ciąg, który zawsze nie jest równy łańcuchowi "0". bash jest wrażliwy na białe znaki, więc '!' musi działać samodzielnie. Jak wspomina @devnull, jeśli chcesz uzyskać status wyjścia, potrzebujesz zmiennej '$?'. –

+0

@glennjackman Dzięki! To wyjaśnia to. A co z tymi z '-ne' chociaż? Dlaczego są oceniane inaczej niż te z '! ='? (dlaczego jest pusty ciąg "równy" do "0"/0 z "-ne" ale nie równy "0"/0 z '! ='?) – 3cheesewheel

+1

[arytmetyka powłoki] (http: // www. gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic) sekcja instrukcji mówi: "Wartość pusta ma wartość 0." –

1

Rozważmy logiczną skrót zamiast instrukcji if:

is_git_repository || echo you are NOT in a git repo