Все приведенные ответы замените cmd3
на cat
. Вы также можете избежать запуска любой команды с помощью:
if [ -n "$DEFINE" ]; then
alias maybe_cmd3='cmd3 |'
else
alias maybe_cmd3=''
fi
cmd1 |
cmd2 |
maybe_cmd3
cmd4 |
... |
cmdN > result.txt
Это POSIX, но обратите внимание, что если в bash
сценарии, bash
который не находится в sh
-mode (как в сценарии, начинающемся с #! /path/to/bash
), вам необходимо включить расширение псевдонима с помощью shopt -s expand_aliases
(или set -o posix
).
Другой подход, который по-прежнему не запускает ни одной ненужной команды, заключается в использовании eval:
if [ -n "$DEFINE" ]; then
maybe_cmd3='cmd3 |'
else
maybe_cmd3=''
fi
eval "
cmd1 |
cmd2 |
$maybe_cmd3
cmd4 |
... |
cmdN > result.txt"
Или:
eval "
cmd1 |
cmd2 |
${DEFINE:+cmd3 |}
cmd4 |
... |
cmdN > result.txt"
В Linux (по крайней мере) вместо cat
, вы могли бы использовать, pv -q
который использует splice()
вместо read()
+, write()
чтобы передавать данные между двумя каналами, что позволяет избежать перемещения данных дважды между ядром и пользовательским пространством.