粘贴tee命令的结果

时间:2013-06-24 23:52:48

标签: bash

这只是一个假设的问题 - 没有解决任何真正的问题 - 只是学习bash。

使用tee命令可以将输出拆分为更多不同的流,例如:

command1 | tee >(commandA1 | commandA2 >file1) >(commandB1 | commandB2 >file2) >file0

以图形方式完成下一个

                  ---commandA1---commandA2--> file1
                 /
command1---tee-------> file0
                 \
                  ---commandB1---commandB2--> file2

现在,使用paste命令即可​​。

paste file1 file2 | command3

但我又可以重定向到不同程序的粘贴输出,例如:

paste <(ls) <(ls) | command3

问题是:有可能将两个流加入一个,比如

                  ---commandA1---commandA2---
                 /                           \
command1---tee-------> file0                  --- paste---command3
                 \                           /
                  ---commandB1---commandB2---

Ps:没有中间文件的意思......

1 个答案:

答案 0 :(得分:4)

以下是使用命名管道的方法:

trap "rm -f /tmp/file1 /tmp/file2; exit 1" 0 1 2 3 13 15
mkfifo /tmp/file1
mkfifo /tmp/file2
command1 | tee >(commandA1 | commandA2 >/tmp/file1) >(commandB1 | commandB2 >/tmp/file2) >file0
paste /tmp/file1 /tmp/file2 | command3
rm -f /tmp/file1 /tmp/file2
trap 0

工作示例:

$ cd -- "$(mktemp -d)" 
$ trap "rm -f pipe1 pipe2; exit 1" 0 1 2 3 13 15
$ mkfifo pipe1 pipe2
$ printf '%s\n' 'line 1' 'line 2' 'line 3' 'line 4' | tee \
>(sed 's/line /l/' | head -n 2 > pipe1) \
>(sed 's/line /Line #/' | tail -n 2 > pipe2) \
> original.txt
$ paste pipe1 pipe2 | sed 's/\t/ --- /'
l1 --- Line #3
l2 --- Line #4
$ rm pipe1 pipe2
$ trap 0