Linux tee的花式用法和pee

 

1.tee多重定向

tee [options] FILE1 FILE2 FILE3...

tee的作用是将一份标准输入多重定向,一份重定向到标准输出/dev/stdout,然后还将标准输入重定向到每个文件FILE中。

例如:

$ cat alpha.log | tee file1 file2 file3 | cat $ cat alpha.log | tee file1 file2 file3 >/dev/null

上面第一个命令将alpha.log的文件内容重定向给file{1..3}和标准输出通过管道传递给cat;
上面第二个命令将alpha.log的文件内容重定向给file{1..3}和/dev/null。

tee重定向给多个命令

写多了脚本的人可能遇到过这样一种需求:将一份标准输入,重定向到多个命令中去。大概是这样的:

                      | CMD1                     ↗         INPUT | tee                      ↘                       | CMD2

其实bash自身的特性就能实现这样的需求,通过重定向到子shell中,就能模拟一个文件重定向行为:

cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c")

(实际上这里的两个>(cmd_list)不是重定向,而是进程替换。命令行解析开始时,将首先进行进程替换,这两个grep将等待标准输入。然后启动cat和tee,然后tee将标准输出交给两个进程的标准输入)

上面的命令将alpha.txt文件内容重定向为3份:一份给第一个grep命令,一份给第二个grep命令,一份给标准输出。假如alpha.txt的内容是a b c d e5个字母分别占用5行(每行一个字母),上面的输出结果如下:

a b c d e  # 前5行是重定向到/dev/stdout的 a b  # 这2行是重定向给第一个grep后的执行结果 b c d  # 这3行是重定向给第二个grep后的执行结果

如果不想要给标准输出的那份重定向,加上>/dev/null

cat alpha.txt | tee >(grep -E "a|b") >(grep -E "d|b|c") >/dev/null

tee重定向给多个命令时的问题

但是必须注意,tee将数据重定向给不同命令时,这些命令是独立执行的,它们都会各自打开一个属于自己的STDOUT,如果它们都重定向到标准输出,由于涉及到多个不同的/dev/stdout,它们的结果将出现两个问题:

  1. 不保证有序性
  2. 关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信