猫,回声和过程替换

问题描述 投票:3回答:1

基本上,我试图理解这些命令之间的区别:

cat <<< yolo | tee f.txt
echo yolo | tee t.txt

以及那些命令:

cat <<< yolo > >(tee f.txt)
echo yolo > >(tee t.txt)

前两个命令具有完全相同的结果:打印“ yolo”,然后终端将控制权交还给我,这正是我所期望的。

[[user @ localhost〜] $ cat <<< yolo | tee f.txt

yolo

[[user @ localhost〜] $ echo yolo |发球t.txt

yolo

但是使用进程替换,echo会发生一些奇怪的事情。

[[user @ localhost〜] $ cat <<< yolo>>(tee f.txt)

yolo

[[user @ localhost〜] $ echo yolo>>(tee t.txt)

[[user @ localhost〜] $ yolo

终端返回控件之前,文本被打印出来。 为什么在这种情况下为什么要早点获得控制权?

这必须与如何打开进程以及如何在进程之间传递文件描述符有关,但是我有点达到了我的知识极限。

如果我通过管道将其传输到其他任何内容,则一切都会恢复正常,例如echo yolo > >(tee t.txt) | cat

更奇怪的是,将xargs插入echo的效果很好:

[[user @ localhost〜] $ xargs echo <<< yolo>>(tee t.txt)

yolo

但是您可以说xargs是这里的主程序,而不是echo

并且如果我将输入过程替换为cat,则结果混合:

cat < <(echo yolo) > >(tee t.txt)

有时它给我这个:

[[user @ localhost〜] $ cat <>(tee t.txt)

[[user @ localhost〜] $ yolo

有时是这样:

[[user @ localhost〜] $ cat <>(tee t.txt)

yolo

所以我想这可能与系统执行命令的速度有关,这使它变得不可预测。

这是否意味着输出过程替换(例如本例中的tee在后台运行?

bash echo cat process-substitution
1个回答
0
投票

啊,我想我找到了...

处理替代... [[0]进程运行异步,并且其输入或输出显示为文件名...

一旦命令(或分支过程完成),控制权将返回到终端,并显示下一个提示。我最初怀疑内置的list可能起了作用,但实际上确实使时间错了。即一旦使用echo时,> >(tee t.txt)何时打印到控制台并不确定。

为此,请尝试此操作(对于第三个示例):

tee

相对于:

$ cat <<< yolo > >(sleep 1; tee f.txt)
$ yolo

© www.soinside.com 2019 - 2024. All rights reserved.