Czy istnieje sposób, aby ponownie napisać strukturę poleceń, A && B || C | D
aby B lub C zostały podłączone do D?
Przy bieżącym poleceniu uruchamiane są tylko B lub oba C i D.
Na przykład:
Tak, w bash możesz użyć nawiasów:
(A && B || C) | D
W ten sposób wyjście A && B || C
zostanie przekazane do D
.
A && (B || C) | D
, jeśli nie chcesz, aby B, C lub D działały, gdy A zawiedziesh
:)A
znajduje się w podpowłoce, obejmuje to równieżA
.)Możesz to napisać jako
Mówisz, że chcesz uruchomić albo
B
alboC
, aleA && B || C
nie osiągnąć. Jeśli sięA
powiedzie, aleB
uruchomi się i nie powiedzie, wykona sięC
.Uwaga 1: jeśli możesz w jakiś sposób zagwarantować, że
B
zawsze się powiedzie i chcesz pozostać przy krótkiej wersji, nadal bym wybrałkoniec
( ... )
, ponieważ ten ostatni niepotrzebnie wymusza utworzenie nowej podpowłoki, która może, ale nie musi zostać zoptymalizowana.Uwaga 2: zakładamy, że obie formy
A
nie generują danych wyjściowych, co jest prawdą w twoim przykładzie, ale niekoniecznie w ogóle. Można tego uniknąćźródło
{ … }
nie wymusza to utworzenia podpowłoki z powodu potoku? I zaobserwować następujące zachowanie:pgrep bash
ipgrep bash | cat
iif true; then pgrep bash; fi
i{ pgrep bash; }
mają jedną linię wyjścia;( pgrep bash; )
i( pgrep bash; ) | cat
i{ pgrep bash; } | cat
iif true; then pgrep bash; fi | cat
mają dwa wiersze wyników.... | ...
powoduje utworzenie podpowłoki, co jest nieuniknione.( ... )
, przynajmniej teoretycznie, powoduje utworzenie dodatkowej podpowłoki, która{ ...; }
pozwala jej uniknąć, ale właśnie to miałem na myśli mówiąc „może zostać zoptymalizowany lub nie”: możliwe jest, że w tym konkretnym przypadku powłoka zdaje sobie sprawę, że to nie ma znaczenia, efekt byłby taki sam.Odpowiedź akceptora jest poprawna, ale nie obejmuje potencjalnego przypadku użycia, którego nie należy podawać
A
jako wynikuD
. Aby to osiągnąć, konieczne będzie przekierowanie strumienia wA
zależności od potrzeb.Jeśli
A
mimo wszystko chcesz odrzucić dane wyjściowe :Jeśli chcesz zobaczyć dane wyjściowe
A
na terminalu:Jeśli potrzebujesz danych wyjściowych
A
jako danych wejściowych kolejnego poleceniaE
, potrzebujesz dodatkowej grupy poleceń i przekierowania strumienia:Jeśli to wszystko wydaje się zbyt tajemnicze (tak jak dla mnie), zalecamy użycie specjalnej zmiennej powłoki dla statusu wyjścia
A
i pracę z tym:Jeśli chcesz być bardziej zwięzły, ale nie zbyt tajemniczy, sugeruję to:
(Zobacz także ostatnią część odpowiedzi hvd, której nie zauważyłem, kiedy napisałem swoją pierwotną odpowiedź).
źródło
A
wyszedłem z rurociągu.