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