热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Bash中,当您将多个异步命令传递给一个使用者时会发生什么?

如何解决《在Bash中,当您将多个异步命令传递给一个使用者时会发生什么?》经验,为你挑选了1个好方法。

考虑一下这个Bash代码:

(cmd1 & cmd2) | consumer

consumer标准输入可能会出现什么样的情况?

    输出cmd1,然后输出cmd2

    来自cmd1任意点缀的线条来自cmd2

    来自cmd1任意散布的字节来自cmd2

    别的什么?

rici.. 5

您可以期望看到随机交错的数据,但如果线条较短,则很可能在大多数情况下您会看到整行交错.

由于进程已stdout重定向到管道(不是交互式设备),因此输出可能是完全缓冲的.由于缓冲区在满时写入,可能与行的末尾不对应,您可能会看到交错缓冲区,每个缓冲区末尾都有混合行.

Posix系统接口,2.5标准IO流:

打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.

但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效应.

这是一个快速测试:

$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117

awk程序将打印其没有在组合输出中出现两次,这将包括所有混行的任何行.所以在那种情况下,大约一千行中的一行被混合在一起.

顺便说一下,(cmd1 & cmd2)只有cmd1在后台运行.尽管如此,它们仍然是相互异步的.



1> rici..:

您可以期望看到随机交错的数据,但如果线条较短,则很可能在大多数情况下您会看到整行交错.

由于进程已stdout重定向到管道(不是交互式设备),因此输出可能是完全缓冲的.由于缓冲区在满时写入,可能与行的末尾不对应,您可能会看到交错缓冲区,每个缓冲区末尾都有混合行.

Posix系统接口,2.5标准IO流:

打开时,标准错误流未完全缓冲; 当且仅当可以确定流不参考交互设备时,标准输入和标准输出流被完全缓冲.

但是,不能保证整个缓冲区将以原子方式写入管道,因此可能存在其他交错效应.

这是一个快速测试:

$ (seq 100000 & seq 100000 &) | sort | uniq -c | awk '$1!=2' | wc -l
117

awk程序将打印其没有在组合输出中出现两次,这将包括所有混行的任何行.所以在那种情况下,大约一千行中的一行被混合在一起.

顺便说一下,(cmd1 & cmd2)只有cmd1在后台运行.尽管如此,它们仍然是相互异步的.


推荐阅读
author-avatar
鱼和鱼还有鱼3_Mh_qet
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有