我正在尝试理解这些命令之间的区别:
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 | tee 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 < <(echo yolo) > >(tee t.txt) [user@localhost ~]$ yolo ```
有时是这个:
``` [user@localhost ~]$ cat < <(echo yolo) > >(tee t.txt) yolo ```
因此,我猜这可能与系统执行命令的速度有关,这使得它变得不可预测。
那是否意味着输出进程替换(例如本例中的
tee
)在后台运行?
echo
是内置的事实有关,而在所有四个选项中,少了一个fork()
/clone()
,您可以将其替换为/bin/echo yolo > >(tee t.txt)
,然后您应该再次获得与前三个相同的行为。至少这是我观察到的。 - Ondrej K./usr/bin/echo yolo > >(tee t.txt)
还是使用带引号的'echo' yolo > >(tee t.txt)
,都会得到与echo yolo > >(tee t.txt)
相同的结果。但如果这与性能有关,则调用/usr/bin/echo
可能会稍微慢/快一些,具体取决于系统,从而导致在不同计算机上出现/消失问题。 - vdavidecho yolo >(tee t.txt) | cat
将同步输出。 - KamilCuk{ echo yolo; echo $? > "temporary_tile"; } | tee t.txt;
- KamilCuk