Q&A - czym jest kod wyjścia programu?

Kod wyjścia programu jest wynikiem zakończenia naszej aplikacji. Jest to wartość która jest zwracana do środowiska systemowego i dzięki niej możemy się dowiedzieć, czy program zakończył się poprawnie, czy też nie. Najczęściej stosuje się kod = 0, exit(0) jeśli nie wystąpił żaden błąd, wartości różne od 0 (przedział 0-255) powinny sygnalizować nieprawidłowe działanie aplikacji. Ale co to nam daje w praktyce? Najprostszy przykład to np. uruchamianie polecenia i sprawdzenie wyniku:

$ touch test; cat test; echo $?
0

$? - w BASHu pod tą zmienną jest umieszczany kod wyjścia ostatnio uruchomiego programu (w tym przypadku: cat test), echo $? powoduje wyświetlenie go, jeśli wykonamy dwa razy pod rząd echo $?; echo $? to drugie polecenie echo zwróci kod wyjścia z pierwszego echo $?, więc nasz prawdziwy kod wyjścia zostanie nadpisany, jeśli chcemy kilka razy użyć tego samego kodu, powinniśmy przypisać go do zmiennej i operować na niej np. RET=$?; echo $RET; echo $RET;

Wróćmy do naszego przykładu widać, że kod wyjścia wynosi 0, program zakończył się poprawnie, sprawdźmy co się stanie, jeśli spróbujemy wyświetlić nieistniejący plik.

$ cat plik_ktorego_nie_ma; echo $?
cat: plik_ktorego_nie_ma: No such file or directory
1

Widać, że kod wyjścia wynosi 1, czyli już wiemy, że coś poszło nie tak, w tym przypadku plik po prostu nie istniał i sytuacja jest prosta.

Jak sprawić by nasz program zwracał odpowiedni kod wyjścia? Używa się do tego funkcji exit($kod_wyjścia), czyli w naszej aplikacji obsługujemy różne wyjątki i jeśli wiemy, że jakaś sytuacja jest niepoprawna, używamy np. exit(1), poniżej krótki Perlowy przykład:

Program, pobiera jako argument liczbę i kończy działanie ustawiając ją jako kod wyjścia, sprawdźmy:

$ ./showCode.pl 0
exit code: 0
$ echo $?
0

$ ./showCode.pl 40
exit code: 40
$ echo $?
40

Odpowiednio obsługując wyjątki w programie jesteśmy w stanie dowiedzieć się jaki był rezultat jego uruchomienia, czy wszyscy powiodło się, lub czy wystąpił jakiś problem, obsługa kodów wyjścia jest bardzo ważnym elementem i jeśli np. piszemy skrypt w którym jedne polecenie przekazuje swój wynik następnemu zawsze powinniśmy upewnić się czy polecenie zakończyło się poprawnie, przed uruchomieniem kolejnego.