Tất cả các câu trả lời cho đến nay thay thế cmd3
bằng cat
. Bạn cũng có thể tránh chạy bất kỳ lệnh nào với:
if [ -n "$DEFINE" ]; then
alias maybe_cmd3='cmd3 |'
else
alias maybe_cmd3=''
fi
cmd1 |
cmd2 |
maybe_cmd3
cmd4 |
... |
cmdN > result.txt
Đó là POSIX, nhưng lưu ý rằng nếu trong bash
tập lệnh bash
không ở sh
chế độ (giống như tập lệnh bắt đầu #! /path/to/bash
), bạn sẽ cần bật mở rộng bí danh bằng shopt -s expand_aliases
(hoặc set -o posix
).
Một cách tiếp cận khác vẫn không chạy bất kỳ lệnh không cần thiết nào là sử dụng eval:
if [ -n "$DEFINE" ]; then
maybe_cmd3='cmd3 |'
else
maybe_cmd3=''
fi
eval "
cmd1 |
cmd2 |
$maybe_cmd3
cmd4 |
... |
cmdN > result.txt"
Hoặc là:
eval "
cmd1 |
cmd2 |
${DEFINE:+cmd3 |}
cmd4 |
... |
cmdN > result.txt"
Trên Linux (ít nhất), thay vì cat
, bạn có thể sử dụng sử pv -q
dụng splice()
thay vì read()
+ write()
để truyền dữ liệu qua lại giữa hai ống dẫn để tránh việc dữ liệu được di chuyển hai lần giữa kernel và không gian người dùng.