अब तक दिए गए सभी उत्तरों के 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()