基本上,我试图理解这些命令之间的区别:
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
在后台运行?
啊,我想我找到了...
处理替代... [[0]进程运行异步,并且其输入或输出显示为文件名...
一旦命令(或分支过程完成),控制权将返回到终端,并显示下一个提示。我最初怀疑内置的list
可能起了作用,但实际上确实使时间错了。即一旦使用echo
时,> >(tee t.txt)
何时打印到控制台并不确定。
为此,请尝试此操作(对于第三个示例):
tee
相对于:
$ cat <<< yolo > >(sleep 1; tee f.txt)
$ yolo