คำตอบทั้งหมดที่ได้รับเพื่อให้ห่างไกลแทนที่ด้วย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"
บน Linux (อย่างน้อย) แทนคุณcat
สามารถใช้pv -q
ที่ใช้splice()
แทนread()
+ write()
เพื่อส่งผ่านข้อมูลระหว่างสองไพพ์ซึ่งหลีกเลี่ยงการย้ายข้อมูลสองครั้งระหว่างเคอร์เนลและพื้นที่ผู้ใช้