Com base no seu exemplo, parece que você está procurando uma maneira de agrupar argumentos para operações com menor precedência do que |
, (por exemplo, &&
e ||
).
Os metacaracteres {
e }
podem ser usados para agrupar dessa maneira.
Seu exemplo acima pode ser escrito assim (usando o status de saída de which
para determinar se cmd2
existe ou não).
cmd1 | { which cmd2 >/dev/null && cmd2 || cat; } | cmd3
Por exemplo
printf "hi\n" | { : && rev || cat; } | cat
imprimirá ih
Sua sugestão de usar um subshell também funcionará, mas usa outro processo desnecessariamente
printf "hi\n" | ( : && rev || cat ) | cat
Eu diria que é provavelmente menos complicado e melhor para manutenção se você usar um if
explícito fora do canal.
if [ which cmd2 >/dev/null ]
then
cmd1 | cmd3
else
cmd1 | cmd2 | cmd3
fi