如何使bash中的管道循环
假设我有一些n>的程序P0,P1,… P(n-1)对于所有的i(0≤i≤n),如何容易地将程序Pi的输出重定向到程序P(i 1 mod n)?
例如,假设我有一个程序方块,它重复读取一个数字,而不是打印该数字的平方和一个程序calc,有时打印一个数字,之后它可以读取它的平方。如何连接这些程序,以便每当计算机打印一个数字时,方形正方形返回到calc? 编辑:我应该用“轻松”来澄清我的意思。命名的管道/ fifo解决方案是一个确实有效的解决方案(我以前曾经使用过),但是如果将其与使用bash管道进行比较,实际上需要相当多的工作才能正常工作。 (您需要获取一个尚未存在的文件名,使用该名称创建一个管道,运行“管道循环”,清理命名管道。)想象你不能再写入prog1 | prog2并且总是必须使用命名管道来连接程序。 我正在寻找与编写“普通”管道一样简单的东西。例如像{prog1 | prog2}& 0将会很棒。
昨天花了相当一段时间,试图将stdout重定向到stdin,最后我用以下方法。这不是很好,但我认为我喜欢它在命名管/ fifo解决方案。
read | { P0 | ... | P(n-1); } >/dev/fd/0 {…}> / dev / fd / 0是将stdout重定向到整个管道序列的stdin(即将P(n-1)的输出重定向到P0的输入)。使用>& 0或类似的东西不行;这可能是因为bash假设0是只读的,而不介意写入/ dev / fd / 0。 初始读取管是必要的,因为没有输入和输出文件描述符是相同的pts设备(至少在我的系统上),重定向没有任何效果。 (pts设备不能像管道一样工作,写入它会使屏幕上的东西)。通过输入{…}普通管道,重定向具有所需的效果。 用我的calc / square示例说明: function calc() { # calculate sum of squares of numbers 0,..,10 sum=0 for ((i=0; i<10; i++)); do echo $i # "request" the square of i read ii # read the square of i echo "got $ii" >&2 # debug message let sum=$sum+$ii done echo "sum $sum" >&2 # output result to stderr } function square() { # square numbers read j # receive first "request" while [ "$j" != "" ]; do let jj=$j*$j echo "square($j) = $jj" >&2 # debug message echo $jj # send square read j # receive next "request" done } read | { calc | square; } >/dev/fd/0 运行上面的代码给出以下输出: square(0) = 0 got 0 square(1) = 1 got 1 square(2) = 4 got 4 square(3) = 9 got 9 square(4) = 16 got 16 square(5) = 25 got 25 square(6) = 36 got 36 square(7) = 49 got 49 square(8) = 64 got 64 square(9) = 81 got 81 sum 285 当然,这种方法是相当一个黑客。特别是读取部分具有不希望的副作用:终止“真实”管道循环不会导致整个终止。我不能想到任何比阅读更好的东西,因为你似乎只能通过尝试写一些东西来确定管道循环已经终止。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 从PRISM开始学WPF(三)Prism-Region-更新至Prism7.1
- angularjs – 无法解析’…’从状态”
- 跟我学AngularJs:AngularJs入门及第一个实例
- ArcGIS Product/version not specified. 解决方案
- angular2材质2 Datepicker – 输出日期格式
- 在Angular2中使用带有FormGroup的jquery-steps
- AngularJS示例 – 未捕获错误:无模块:myapp
- scala – 为什么这个擦除警告与成员变量声明为一个元组?
- bower bootstrap-sass和bootstrap-sass-official之间有什么
- Bootstrap居中显示