Bash 如何理解tee命令?

Bash 如何理解tee命令?,bash,Bash,我的目录有四个文件: 1 2 3 4 然后我运行命令 ls | tee >(ls) | more 它会打印出来 1 3 2 4 1 2 3 4 但是当我跑的时候 ls | tee>(echo hello) | more 只有 hello 为什么??在第一个命令中,第一个ls的结果将指向more,第二个ls的结果也将指向more。 但是在第二个命令中,为什么ls的结果没有指向更多 顺便问一下,>是什么意思 通常>是用于将标准输出重定向到文件的运算符。在这里,它使用了Bash

我的目录有四个文件:

1 2 3 4 
然后我运行命令

ls | tee >(ls) | more
它会打印出来

1
3
2
4
1
2
3
4
但是当我跑的时候

ls | tee>(echo hello) | more
只有

hello
为什么??在第一个命令中,第一个ls的结果将指向more,第二个ls的结果也将指向more。 但是在第二个命令中,为什么ls的结果没有指向更多

顺便问一下,>是什么意思

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

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

foo | tee foo.out | bar
结果:

foo --> tee --> bar
         |
         V
      foo.out
过程替代 进程替换是Bash的一项功能,它使shell向被替换的进程打开一个命名管道,并传递该命名管道以代替文件名。例如:

diff <(echo hello) <(echo goodbye)
结合tee和过程替代 没关系,因为ls甚至不看它的标准输入。所以你有:

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

ls --> tee --> more
        |
        V
    /dev/fd/63
因此,首先您看到括号中的ls输出目录列表,它从不读取您提供给它的stdin。然后您将看到更多打印第一个ls的输出。tee的输出丢失,因为您已将其发送到其他ls。结果如何?ls的输出两次。

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

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

foo | tee foo.out | bar
结果:

foo --> tee --> bar
         |
         V
      foo.out
过程替代 进程替换是Bash的一项功能,它使shell向被替换的进程打开一个命名管道,并传递该命名管道以代替文件名。例如:

diff <(echo hello) <(echo goodbye)
结合tee和过程替代 没关系,因为ls甚至不看它的标准输入。所以你有:

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

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

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

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

然后命令

ls | tee

它表明

一,

二,

三,

四,

tee命令用于显示标准输出

然后跑

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

打开文件fil2.txt

vim file2.txt

您将看到以下输出

一,

二,

三,

四,


file2.txt

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

然后命令

ls | tee

它表明

一,

二,

三,

四,

tee命令用于显示标准输出

然后跑

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

打开文件fil2.txt

vim file2.txt

您将看到以下输出

一,

二,

三,

四,


file2.txt

您不想解释tee>echo hello中缺少空格的原因吗,这意味着第二个示例从未运行过tee,并且可能是,more劫持了终端并隐藏了错误消息,或者OP只是自己忽略了错误?总之,+1::伟大的ascii艺术。@rici啊,我错过了。然而,我对这个问题已经厌倦了。我认为你的评论是公正的。括号中的ls就像一个文件,那么为什么文件的内容会被定向到stdout?你不想解释一下tee>echo hello中缺少的空格吗,这意味着第二个示例从未运行过tee,并且,据推测,,,more劫持了终端并隐藏了错误消息,还是OP自己忽略了错误?总之,+1::伟大的ascii艺术。@rici啊,我错过了。然而,我对这个问题已经厌倦了。我认为你的评论很公正。括号中的ls就像一个文件,那么为什么一个文件的内容会指向stdout?ls | tee