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如果我有目录1,2,3,4 然后命令 ls | tee 它表明 一, 二, 三, 四, tee命令用于显示标准输出 然后跑 ls | tee
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