我认为对于 linux 命令,管道:
$ command1 | command2 | command3
将按顺序执行命令 1 -> 命令 2 -> 命令 3。
但是使用 tee 怎么样:
$ command1 | tee >(command2) >(command3)
由于command2
和command3
具有相同的输入,我的问题是,command2
和将command3
并行执行(多线程?)还是按顺序 2->3 执行?
谢谢。
答案1
如果它们能够并行执行,它们将并行执行。命令tee
将在获得输入后向两个命令提供输入。如果它们在输入时被阻止,这将使它们“准备运行”,然后操作系统会将它们调度到任何可用的内核上。这不是多线程,因为那是在进程内发生的。这是多进程操作。
答案2
尝试运行此命令(稍后按 Ctrl-C 键):
(od -x /dev/urandom | tee >(sed 's/^/1 /') >(sed 's/^/2 /')) > /tmp/output
当每个进程有机会运行时,/tmp/output 将被交错和覆盖。
另外,当您说“将按顺序执行”时,这是不正确的。我认为 DOS 曾经使用临时文件模拟管道,但 Unix 没有。
(我之前从未见过 >() 语法。每天学习新东西!)