gpt4 book ai didi

bash - 猫、 echo 和进程替换

转载 作者:行者123 更新时间:2023-12-02 16:01:30 24 4
gpt4 key购买 nike

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

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)在后台运行?

最佳答案

啊,我想我找到了it ...

Process Substitution ... The process list is run asynchronously, and its input or output appears as a filename...

一旦命令(或 fork 进程完成),控制权将返回到终端并显示下一个提示。我最初怀疑内置的 echo 可能发挥了作用,但它实际上只是扭曲了时间。 IE。一旦使用 >>(tee t.txt) tee 何时打印到控制台并不完全确定。

就此而言,请尝试以下操作(对于您的第三个示例):

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

相对于:

$ { echo yolo; sleep 1 ;} > >(tee t.txt)
yolo
$
<小时/>

不同之处在于 >(list) 进程替换如上所述是异步执行的。尝试两个示例中的前一个,即使使用更大的 sleep 值来模拟长时间运行的进程。当您继续使用 shell 时,它会一直徘徊(实际上,即使您终止它,在这种情况下,它会重新设置父级,但您仍然会在进程列表中看到;旁注:“命令作为命令替换的结果忽略键盘生成的作业控制信号 SIGTTINSIGTTOUSIGTSTP。” -> 甚至丢失终端不会杀死它们,与下面的异步 (&) 执行示例不同)。

Pipelines另一方面:

If the pipeline is not executed asynchronously (see Lists), the shell waits for all commands in the pipeline to complete.

在管道中的所有命令完成执行之前,Shell 不会恢复控制(不执行下一个命令)。

尝试:

$ echo yolo |  (sleep 1; tee f.txt)
yolo
$

相对于(类似于使用 >(list)):

echo yolo |  ((sleep 1; tee f.txt) &)
$ yolo

(双子 shell 并不是真正需要的,我只是用它来抑制正在运行的 shell 中的作业控制消息)。

关于bash - 猫、 echo 和进程替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60394727/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com