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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.