有谁知道bash如何处理通过管道发送数据?
cat file.txt | tail -20
Run Code Online (Sandbox Code Playgroud)
此命令是否将file.txt的所有内容打印到缓冲区中,然后由尾部读取?或者,这个命令是否逐行打印file.txt的内容,然后在每一行暂停以便尾部处理,然后要求更多数据?
我问的原因是我在嵌入式设备上编写程序,该程序基本上对某些数据块执行一系列操作,其中一个操作的输出作为下一个操作的输入发送.我想知道linux(bash)如何处理这个问题所以请给我一个通用答案,而不是具体说当我运行"cat file.txt | tail -20"时会发生什么.
提前感谢您的回复!
编辑:Shog9指出了相关的维基百科文章,这并没有直接引导我直到文章,但它帮助我找到了这个:http://en.wikipedia.org/wiki/Pipeline_%28Unix%29#Implementation确实有我正在寻找的信息.
对不起,我很抱歉.当然你正在使用管道,当然你正在使用命令各个部分的stdin和stdout.我原以为这太明显了.
我问的是如何处理/实施.由于两个程序不能同时运行,数据如何从stdin发送到stdout?如果第一个程序生成的数据明显快于第二个程序,会发生什么?系统是否只运行第一个命令,直到它被终止或它的stdout缓冲区已满,然后转到下一个程序,依此类推,直到没有剩余的数据要处理,或者是否有更复杂的机制?
这是一个用于随机生成10个字符密码的管道命令:
cat /dev/urandom | base64 | head -c 10
Run Code Online (Sandbox Code Playgroud)
我的问题是cat /dev/urandom | base64无限输出流本身不会停止.但为什么追加head -c 10会使整个管道终止?我假设cat,base64并且head是3个独立的进程,如何head终止cat?