¿Hay alguna manera de reescribir la estructura de comandos A && B || C | D
para que B o C se canalicen a D?
Con el comando actual solo se ejecutan B o C y D.
Por ejemplo:
Sí, en bash puedes usar paréntesis:
(A && B || C) | D
De esta manera, la salida de A && B || C
se canalizará a D
.
A && (B || C) | D
, si no desea que B, C o D se ejecuten cuando A fallash
:)A
está dentro del subshell, esto también incluyeA
).Puedes escribir esto como
Dices que quieres ejecutar cualquiera
B
oC
, peroA && B || C
no lo logras. SiA
tiene éxito, pero seB
ejecuta y falla, se ejecutaráC
.Nota 1: si de alguna manera puede garantizar que
B
siempre tenga éxito y quiera seguir con una versión corta, entonces aún optaría porterminado
( ... )
, ya que este último obliga innecesariamente a crear una nueva subshell, que puede optimizarse o no.Nota 2: ambas formas asumen que
A
no producen resultados, lo cual es cierto en su ejemplo, pero no necesariamente en general. Eso puede ser evitado porfuente
{ … }
no obliga a crear una subshell debido a la tubería? Observo el siguiente comportamiento:pgrep bash
ypgrep bash | cat
yif true; then pgrep bash; fi
y{ pgrep bash; }
tengo una línea de salida;( pgrep bash; )
y( pgrep bash; ) | cat
y{ pgrep bash; } | cat
yif true; then pgrep bash; fi | cat
tienen dos líneas de salida.... | ...
hace que se cree una subshell, eso es inevitable.( ... )
, al menos en teoría, hace que se cree un subshell adicional que{ ...; }
evita, pero eso es lo que quise decir con "puede o no optimizarse": es posible que en este caso particular, el shell se dé cuenta de que no importa, el El efecto sería el mismo.La respuesta del aceptador es correcta pero no cubre el caso de uso potencial para no tener la salida de
A
como la entrada deD
. Para lograrlo, necesitará una redirección de transmisión enA
función de sus necesidades.Si desea descartar la salida de
A
todos modos:Si desea ver la salida de
A
en el terminal:Si necesita la salida de
A
como la entrada de un comando posteriorE
, necesitará un grupo de comando adicional y una redirección de flujo:Si todo esto le parece demasiado arcano (como a mí), le recomiendo que use la variable de shell especial para el estado de salida
A
y trabaje con eso:Si quieres ser más conciso pero no demasiado arcano, te sugiero esto:
(Vea también la última parte de la respuesta de hvd que no noté cuando escribí mi respuesta original).
fuente
A
de la tubería.