set line = ($<)
while(${#line} != 0)
if(${#line} == 5) then
echo line | sort | ./calculate ${1}
endif
set line = ($<)
end
我需要选择包含5个单词的所有行,并在排序后和转移后,但我很困惑,它将如何工作,首先'while'将获取所有信息,然后将其转移到排序,或者每次迭代'while'都会排序吗?提前谢谢
答案 0 :(得分:3)
如果OP关心内部,管道通常被实现为循环缓冲区。这就是操作系统放弃了一大块内存并跟踪它当前正在使用的部分(根据需要从末尾到开头):
+-------+
| front |
+-------+
| +-------+
| | back |-------\
V +-------+ V
+---+---+---+---+---+ +---+---+----+---+---+---+
| | c | o | n | t | ... | e | r | \n | | | | // the buffer itself
+---+---+---+---+---+ +---+---+----+---+---+---+
我们用这些规则来控制行为:
front
和back
始终相同(如在起始条件中),则管道为空并且尝试从中读取将阻塞,直到有东西要读。back
是(front-1)
(模数长度,请记住!),缓冲区已满,尝试写入将阻塞,直到有空间。front
处的内容,然后前进一个。back
的值写入一个,并在此位置插入新输入。更复杂的方案涉及在需要和内存时允许缓冲区增长是可能的(并且确实很常见),并且通过使缓冲区本身只有一个可以简化上述方案字符长(意味着我们甚至不需要正面和背面)但你需要花费大量的锁定和许多不必要的上下文切换。
答案 1 :(得分:2)
由于您在每次迭代中都运行echo line | sort | ./calculate ${1}
命令,因此每次都会单独运行。管道只接受左侧命令的输出,并将其输入右侧命令的输入。
答案 2 :(得分:1)
管道是同时读取输入并产生输出的东西,例如,您可以使用管道接收由小写字母组成的输入,管道将修改(不更改原始源输入数据,例如数据文件)输入数据并将其改为大写字母。
管道以从左到右的方式处理。
echo line | sort | ./calculate ${1}
line
通过管道传输到sort
。 Sort
然后对输入数据进行排序并输出数据,然后将数据通过管道传输到期望输入的calculate
进程。
以这种方式可视化更容易,将其视为管道或塑料管(雨水槽品种):
INPUT <---+---> OUTPUT | pipe
<强> 编辑: 强>
由于您的原始问题要求解释基于C Shell的代码段,而不再赘述......
1. set line = ($<) 2. while(${#line} != 0) 3. if(${#line} == 5) then 4. echo line | sort | ./calculate ${1} 5. endif 6. set line = ($<) 7. end
line
设置为包含更多输入。并重新循环。 如果您愿意,可以回答您的评论,我会突出显示第4行:
echo line | sort | uniq | ./calculate ${1}
顺便说一句,如果我的记忆能够正确使用,我认为line
应该是$line
,请随意使用该组合。