अब तक दिए गए सभी उत्तरों के 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मोड (एक स्क्रिप्ट के साथ शुरू के साथ की तरह #! /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"
लिनक्स पर (कम से कम), के बजाय cat, आप उन दो पाइपों के बीच डेटा को पास करने के लिए + के बजाय का उपयोग कर सकते हैं pv -qजो कर्नेल और उपयोगकर्ता स्थान के बीच दो बार स्थानांतरित किए गए डेटा से बचते हैं।splice()read()write()