Tubo B para D? -A&&B || C | D

Tubo B para D? -A&&B || C | D

Existe uma maneira de reescrever a estrutura de comando A && B || C | Dpara que B ou C seja canalizado para D?

Com o comando atual, apenas B ou C e D são executados.

Por exemplo:

insira a descrição da imagem aqui

Responder1

Sim, no bash você pode usar parênteses:

(A && B || C) | D

Dessa forma, a saída de A && B || Cserá canalizada para D.

Responder2

Você pode escrever isso como

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

Você diz que deseja executar Bor C, mas A && B || Cnão consegue isso. Se Afor bem-sucedido, mas Bfor executado e falhar, ele será executado C.

Nota 1: se você puder de alguma forma garantir que Bsempre terá sucesso e quiser ficar com uma versão curta, então eu ainda optaria por

{ A && B || C; } | D

over ( ... ), já que este último força desnecessariamente a criação de um novo subshell, que pode ou não ser otimizado.

Nota 2: ambas as formas assumem que Anão produzem saída, o que é verdade no seu exemplo, mas não necessariamente em geral. Isso pode ser evitado por

A; if [ "$?" -eq 0 ]; then B; else C; fi | D

Responder3

A resposta do aceitante está correta, mas não cobre o caso de uso potencial paranãotem a saída de Acomo entrada de D. Para conseguir isso, você precisará de um redirecionamento de fluxo Adependendo de suas necessidades.

  • Se você quiser descartar a saída de Aqualquer maneira:

    { A >/dev/null && B || C; } | D
    
  • Se você quiser ver a saída Ano terminal:

    { A >/dev/tty && B || C; } | D
    
  • Se você precisar da saída de Acomo entrada de um comando subsequente, Eprecisará de um grupo de comandos adicional e de um redirecionamento de fluxo:

    { { A >&3 && B || C; } | D; } 3>&1 | E
    

Se tudo isso parece muito misterioso para você (como parece para mim), recomendo que você use a variável shell especial para o status de saída Ae trabalhe com isso:

A
if [ $? -eq 0 ]; then
  B
else
  C
fi |
D

Se você quiser ser mais conciso, mas não muito misterioso, sugiro o seguinte:

A; { [ $? -eq 0 ] && B || C; } | D

(Veja também a última parte doresposta de hvdo que não percebi quando escrevi minha resposta original.)

informação relacionada