gpt4 book ai didi

bash - 如何理解tee命令?

转载 作者:行者123 更新时间:2023-12-02 15:28:40 25 4
gpt4 key购买 nike

我的目录有四个文件:

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的结果没有指向more呢?

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

最佳答案

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

三通

通常,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

结合tee和进程替换

ls | tee >(ls) | more

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

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

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

所以首先你会看到括号中的 ls 输出你的目录列表(它从不读取你给它的标准输入)。然后您会看到 more 打印第一个 ls 的输出。 tee 的输出丢失了,因为您将它发送给了其他 ls。结果? ls 的输出两次

关于bash - 如何理解tee命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29069813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com