Todas las respuestas dadas hasta ahora se reemplazan cmd3
con cat
. También puede evitar ejecutar cualquier comando con:
if [ -n "$DEFINE" ]; then
alias maybe_cmd3='cmd3 |'
else
alias maybe_cmd3=''
fi
cmd1 |
cmd2 |
maybe_cmd3
cmd4 |
... |
cmdN > result.txt
Eso es POSIX, pero tenga en cuenta que si está en un bash
script donde bash
no está en sh
modo (como con un script que comienza con #! /path/to/bash
), deberá habilitar la expansión de alias con shopt -s expand_aliases
(o set -o posix
).
Otro enfoque que aún no ejecuta ningún comando innecesario es usar eval:
if [ -n "$DEFINE" ]; then
maybe_cmd3='cmd3 |'
else
maybe_cmd3=''
fi
eval "
cmd1 |
cmd2 |
$maybe_cmd3
cmd4 |
... |
cmdN > result.txt"
O:
eval "
cmd1 |
cmd2 |
${DEFINE:+cmd3 |}
cmd4 |
... |
cmdN > result.txt"
En Linux (al menos), en lugar de cat
, podría usar pv -q
which uses en splice()
lugar de read()
+ write()
para pasar los datos entre las dos tuberías, lo que evita que los datos se muevan dos veces entre el kernel y el espacio de usuario.