Respuesta1
Sí, en bash puedes usar paréntesis:
(A && B || C) | D
De esta manera, la salida de A && B || C
se canalizará a D
.
Respuesta2
Puedes escribir esto como
if A; then B; else C; fi | D
Dices que quieres ejecutar B
o C
, pero A && B || C
no lo logras. Si A
tiene éxito, pero B
se ejecuta y falla, se ejecutará C
.
Nota 1: si de alguna manera puedes garantizar que eso B
siempre tenga éxito y quieres seguir con una versión corta, entonces igualmente optaría por
{ A && B || C; } | D
over ( ... )
, ya que este último obliga innecesariamente a crear una nueva subcapa, que puede optimizarse o no.
Nota 2: ambas formas suponen que A
no produce resultados, lo cual es cierto en su ejemplo, pero no necesariamente en general. Eso se puede evitar mediante
A; if [ "$?" -eq 0 ]; then B; else C; fi | D
Respuesta3
La respuesta del aceptador es correcta pero no cubre el caso de uso potencial paranotener la salida de A
como entrada de D
. Para lograrlo, necesitará una redirección de transmisión A
según sus necesidades.
Si desea descartar la salida de
A
todos modos:{ A >/dev/null && B || C; } | D
Si desea ver la salida de
A
en la terminal:{ A >/dev/tty && B || C; } | D
Si necesita la salida de
A
como entrada de un comando posterior,E
necesitará un grupo de comandos adicional y una redirección de flujo:{ { A >&3 && B || C; } | D; } 3>&1 | E
Si todo esto te parece demasiado arcano (como me parece a mí), te recomiendo que uses la variable de shell especial para el estado de salida A
y trabajes con eso:
A
if [ $? -eq 0 ]; then
B
else
C
fi |
D
Si quieres ser más conciso pero no demasiado arcano te sugiero esto:
A; { [ $? -eq 0 ] && B || C; } | D
(Ver también la última parte dela respuesta de hvdlo cual no noté cuando escribí mi respuesta original).