¿Tubo B a D? - A && B || C | D

¿Tubo B a D? - A && B || C | D

¿Hay alguna manera de reescribir la estructura del comando A && B || C | Dpara que B o C se canalicen a D?

Con el comando actual se ejecuta solo B o C y D.

Por ejemplo:

ingrese la descripción de la imagen aquí

Respuesta1

Sí, en bash puedes usar paréntesis:

(A && B || C) | D

De esta manera, la salida de A && B || Cse canalizará a D.

Respuesta2

Puedes escribir esto como

if A; then B; else C; fi | D

Dices que quieres ejecutar Bo C, pero A && B || Cno lo logras. Si Atiene éxito, pero Bse ejecuta y falla, se ejecutará C.

Nota 1: si de alguna manera puedes garantizar que eso Bsiempre 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 Ano 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 Acomo entrada de D. Para lograrlo, necesitará una redirección de transmisión Asegún sus necesidades.

  • Si desea descartar la salida de Atodos modos:

    { A >/dev/null && B || C; } | D
    
  • Si desea ver la salida de Aen la terminal:

    { A >/dev/tty && B || C; } | D
    
  • Si necesita la salida de Acomo entrada de un comando posterior, Enecesitará 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 Ay 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).

información relacionada