如何理解tee命令?

时间:2015-03-16 04:52:07

标签: bash

我的目录有四个文件:

1 2 3 4 

然后我运行命令

ls | tee >(ls) | more

它会打印

1
3
2
4
1
2
3
4

但是当我跑步时

ls | tee>(echo hello) | more

只有

hello

为什么呢?在第一个命令中,第一个ls的结果将被定向到更多,第二个ls的结果也将被定向到更多。 但是在第二个命令中,为什么ls的结果不会被引导到更多?

顺便说一句,>意思?

2 个答案:

答案 0 :(得分:5)

通常>是用于将标准输出重定向到文件的运算符。在这里,它使用了称为process substitution的Bash功能,它允许您将进程的标准输入或输出替换为预期的输出文件或输入文件(分别)。

三通

通常,tee会将其标准输入写入您告诉它的文件名及其标准输出。它有效地将“T”放入数据管道中。

foo | tee foo.out | bar

结果:

foo --> tee --> bar
         |
         V
      foo.out

流程替换

进程替换是Bash的一个特性,它使shell打开一个命名管道,代替文件替换你的进程,并传递该命名管道代替文件名。例如:

diff <(echo hello) <(echo goodbye)

结果

echo hello > /dev/fd/63 &
echo hello > /dev/fd/62 &
diff /dev/fd/63 /dev/fd/62

结合T恤和工艺替代

ls | tee >(ls) | more

无所谓,因为ls甚至没有查看其标准输入。所以你有:

ls < /dev/fd/63 &       # which never gets read

ls --> tee --> more
        |
        V
    /dev/fd/63

首先,您会看到括号中的ls输出您的目录列表(它永远不会读取您提供的stdin)。然后,您会看到more打印第一个ls的输出。 tee的输出已丢失,因为您已将其发送给其他ls。结果? ls 的输出两次

答案 1 :(得分:0)

如果我有目录1,2,3,4

然后是命令

ls |发球区域

显示

1

2

3

4

tee命令用于显示标准输出。

然后运行

LS |三通&LT; FILE2.TXT

上面的命令将输出重定向到file2.txt

打开文件fil2.txt

vim file2.txt

你会看到以下输出

1

2

3

4

FILE2.TXT