Todas as respostas dadas até agora são substituídas cmd3
por cat
. Você também pode evitar executar qualquer comando com:
if [ -n "$DEFINE" ]; then
alias maybe_cmd3='cmd3 |'
else
alias maybe_cmd3=''
fi
cmd1 |
cmd2 |
maybe_cmd3
cmd4 |
... |
cmdN > result.txt
Esse é o POSIX, mas observe que, se em um bash
script onde bash
não está em sh
-mode (como em um script começando com #! /path/to/bash
), você precisará ativar a expansão de alias com shopt -s expand_aliases
(ou set -o posix
).
Outra abordagem que ainda não executa nenhum comando desnecessário é usar eval:
if [ -n "$DEFINE" ]; then
maybe_cmd3='cmd3 |'
else
maybe_cmd3=''
fi
eval "
cmd1 |
cmd2 |
$maybe_cmd3
cmd4 |
... |
cmdN > result.txt"
Ou:
eval "
cmd1 |
cmd2 |
${DEFINE:+cmd3 |}
cmd4 |
... |
cmdN > result.txt"
No Linux (pelo menos), em vez de cat
, você pode usar os pv -q
usos em splice()
vez de read()
+ write()
para passar os dados entre os dois canais, evitando que os dados sejam movidos duas vezes entre o kernel e o espaço do usuário.