W klasycznym scenariuszu z priorytetem operatora masz taką linię:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
I nie wiesz, czy jest parsowany ((A && B) | C)czy (A && B | C)...
Prawie oficjalna dokumentacja znaleźć tutaj nie wymienić rurę na liście, więc nie można po prostu sprawdzić w tabeli.
Ponadto w bash (nie służy tylko do zmiany kolejności operacji, ale tworzy podpowłokę , więc nie jestem w 100% pewien, że te linie są odpowiednikiem poprzedniej linii:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Mówiąc bardziej ogólnie, jak poznać AST linii bash? W Pythonie mam funkcję, która daje mi drzewo, dzięki czemu mogę łatwo dwukrotnie sprawdzić kolejność działania.
bashużywa parsera yacc, a nie jakiejś ad-hoc; jeśli yacc -vprzejdziesz przez to, otrzymasz y.outputprzyjemną gramatykę, która to pokazuje &&i ||łączy listy, a listy składają się w końcu z potoków (a nie odwrotnie); tl; dr; A && B | Cjest taki sam A && { B | C; }, jak oczekiwano. Nie zakładaj kolejności wykonywania między Bi C; polecenia w potoku są uruchamiane równolegle .
[...]testach i $((...))ocenach arytmetycznych; w szczególności, ||i &&jak stosować z listy poleceń w języku powłoki mają taki sam priorytet , w przeciwieństwie do odpowiednich podmiotów Club w ocenie arytmetycznej (gdzie &&wiąże mocniej niż ||).
|jest to tylko złącze, które pasuje do standardowego złącza LHS do standardowego złącza RHS. Więc jeślicdpolecenie w twoim przykładzie nie powiedzie się, nie wyśle on żadnych danych wyjściowychhead, aleheadw rzeczywistości nadalexecuteprzeanalizuje nic i nie zwróci żadnych danych wyjściowych.