reguła kodu wyjścia polecenia bash pipe

0

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.

Chihaya
źródło

Odpowiedzi:

1

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ę lsi greppoleceń, a następnie wykonuje echopolecenie.

ojs
źródło
2

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:

if ls | grep -q foo; then echo success, there is foo; fi

Lub, jeśli chcesz wykonać coś po sukcesie, możesz połączyć następną komendę za pomocą &&:

ls | grep -q foo && echo success
janos
źródło