基本上,我试图理解这些命令之间的区别:cat <<< yolo | tee f.txtecho yolo | tee t.txt这些命令:cat <<< yolo > >(tee f.txt)echo yolo > >(tee t.txt)前两个命令的结果完全相同:打印“ yolo”,然后终端将控制权交还给我,这正是我所期望的。 [user @ localhost〜] $ cat 约洛 [user @ localhost〜] $ echo yolo |发球t.txt 约洛但是,使用进程替换时,echo会发生一些奇怪的事情。 [user @ localhost〜] $ cat >(tee f.txt) 约洛 [user @ localhost〜] $ echo yolo>>(发球t.txt) [user @ localhost〜] $ yolo终端会在文本打印出来之前返回控件。在这种情况下,为什么我要早点获得控制权?这必须与如何打开进程以及如何在进程之间传递文件描述符有关,但是我有点达到了我的知识极限。如果我将其传送到其他任何东西,则一切都会恢复正常,例如echo yolo > >(tee t.txt) | cat。更奇怪的是xargs进入echo的效果很好: [user @ localhost〜] $ xargs echo >(tee t.txt) 约洛但是您可以说xargs是这里的主程序,而不是echo。而且,如果我将输入过程替换为cat,则结果会混合:cat < <(echo yolo) > >(tee t.txt)有时它给了我这个: [user @ localhost〜] $ cat >(tee t.txt) [user @ localhost〜] $ yolo有时这是: [user @ localhost〜] $ cat >(tee t.txt) 约洛因此,我想这可能与系统执行命令的速度有关,这使它变得不可预测。这是否意味着输出进程替换(例如本例中的tee)在后台运行? 最佳答案 啊,我想我找到了it ... 流程替代 ...进程list异步运行,其输入或输出显示为文件名...一旦命令(或分支过程完成),控制权将返回到终端,并显示下一个提示。我原本怀疑内置的echo可能起到了作用,但实际上只是使时间错了。即一次使用> >(tee t.txt)何时打印到控制台并不完全是确定性的。为此,请尝试以下操作(对于第三个示例):$ cat <<< yolo > >(sleep 1; tee f.txt)$ yolo相对于:$ { echo yolo; sleep 1 ;} > >(tee t.txt)yolo$区别在于tee进程替换是异步执行的。尝试使用两个示例中的前一个,即使>(list)的值更大,也可以模拟长时间运行的过程。当您继续使用外壳程序时,它会一直徘徊(实际上,即使终止了它,在这种情况下,它也会被重新设置父级,但您仍会在进程列表中看到它;边注:“命令作为命令的结果运行替换时,请忽略键盘生成的作业控制信号sleep,SIGTTIN和SIGTTOU。”->与下面的异步(SIGTSTP)执行示例不同,即使丢失终端也不会杀死它们。另一方面,Pipelines: 如果管道不是异步执行的(请参见清单),则Shell将等待管道中的所有命令完成。在管道中的所有命令完成执行之前,Shell不会恢复控制(下一条命令不会执行)。尝试:$ echo yolo | (sleep 1; tee f.txt)yolo$与(与使用&相似)相反:echo yolo | ((sleep 1; tee f.txt) &)$ yolo(实际上并不需要double子shell,我只是用它来抑制正在运行的shell中的作业控制消息)。关于bash - 猫, echo 和过程替换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60394727/ 10-10 12:26