Responder1
Sim, no bash você pode usar parênteses:
(A && B || C) | D
Dessa forma, a saída de A && B || C
será canalizada para D
.
Responder2
Você pode escrever isso como
if A; then B; else C; fi | D
Você diz que deseja executar B
or C
, mas A && B || C
não consegue isso. Se A
for bem-sucedido, mas B
for executado e falhar, ele será executado C
.
Nota 1: se você puder de alguma forma garantir que B
sempre 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 A
nã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 A
como entrada de D
. Para conseguir isso, você precisará de um redirecionamento de fluxo A
dependendo de suas necessidades.
Se você quiser descartar a saída de
A
qualquer maneira:{ A >/dev/null && B || C; } | D
Se você quiser ver a saída
A
no terminal:{ A >/dev/tty && B || C; } | D
Se você precisar da saída de
A
como entrada de um comando subsequente,E
precisará 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 A
e 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.)