Pisałem prosty skrypt, który sprawdza dane wyjściowe polecenia, które wyświetla określone słowo kluczowe. Aby zobaczyć, czy to działa, sprawdzałem polecenie z linii poleceń bash.
$ ls | grep -q foo $ echo $?
Wyświetlany 1 lub 0 zależy od wyniku polecenia i parametru grep, jak się spodziewałem.
Trochę leniwie wpisuję polecenie, więc dodałem je | echo $?
na końcu wiersza poleceń.
$ ls | grep -q foo | echo $?
Następnie, niezależnie od wyniku polecenia, zawsze zwraca 0, nawet jeśli pierwsza część zwraca 1.
Myślę, że to normalne zachowanie, ale chciałbym wiedzieć, dlaczego bash działa w ten sposób.
Odpowiedzi:
Wynika to z tego, że potok bierze stdout i przesyła go do następnego polecenia, zamiast tego chcesz użyć średnika.
ls | grep -q foo; echo $?
Ten zakończył się
ls
igrep
poleceń, a następnie wykonujeecho
polecenie.źródło
Zmienna specjalna
$?
rozwija się do statusu wyjścia ostatnio wykonanego potoku pierwszego planu . W twoim przykładzie| echo $?
jest to ostatnio wykonany potok pierwszego planu, w tym momencie status wyjścia polecenia przed ostatnim|
nie jest już dostępny za pośrednictwem$?
.W powiązanej notatce możesz użyć kodu wyjścia bezpośrednio w instrukcjach warunkowych, na przykład:
Lub, jeśli chcesz wykonać coś po sukcesie, możesz połączyć następną komendę za pomocą
&&
:źródło