Всі відповіді надані до сих пір замінити 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()щоб передавати дані між двома трубами, що дозволяє уникнути переміщення даних двічі між ядром та користувальницьким простором.