bash – 在shell脚本中使用mkfifo
发布时间:2020-12-15 21:59:38 所属栏目:安全 来源:网络整理
导读:我试图用FIFO做一些简单的事情:读取线条,但不是一次性完成,而且意外地“不起作用”. 还行吧: $f=$(mktemp -u)$mkfifo $f${ seq 5 $f; } [1] 2486$while read line; do echo $line; done $f12345[1]+ Done { seq 10 $f; } 但是,如果我尝试逐行读取行,第一次
我试图用FIFO做一些简单的事情:读取线条,但不是一次性完成,而且意外地“不起作用”.
还行吧: $f=$(mktemp -u) $mkfifo $f ${ seq 5 > $f; } & [1] 2486 $while read line; do echo $line; done < $f 1 2 3 4 5 [1]+ Done { seq 10 > $f; } 但是,如果我尝试逐行读取行,第一次读取成功,第二次读取挂起. ${ seq 5 > $f; } & [1] 2527 $read line < $f; echo $line 1 [1]+ Done { seq 5 > $f; } $read line < $f; echo $line [hangs here...] 有人可以解释一下吗?为什么我不能逐一阅读所有5行?其他数据怎么了? 我发现如果我创建一个文件描述符来重定向FIFO,我可以逐行读取: ${ seq 5 > $f; } & [1] 2732 $exec 3<$f [1]+ Done { seq 5 > $f; } $read -u 3 line && echo $line || echo no more data 1 $read -u 3 line && echo $line || echo no more data 2 $read -u 3 line && echo $line || echo no more data 3 $read -u 3 line && echo $line || echo no more data 4 $read -u 3 line && echo $line || echo no more data 5 $read -u 3 line && echo $line || echo no more data no more data $exec 3<&- 我还是不明白中间情景.谁能解释一下? 版本信息: $bash --version GNU bash,version 4.2.25(1)-release (i686-pc-linux-gnu) Copyright (C) 2011 Free Software Foundation,Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY,to the extent permitted by law. $mkfifo --version mkfifo (GNU coreutils) 8.13 Copyright (C) 2011 Free Software Foundation,Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY,to the extent permitted by law. Written by David MacKenzie. 解决方法
我猜这会发生什么:
$read line< $f打开FIFO进行读取,读取一行,然后关闭FIFO.一旦读取器关闭其侧面的FIFO,则写入器(seq 5> $f)也关闭.当你下次没有人写入FIFO时打开FIFO,所以读取阻塞. 随着FIFO打开读取直到while命令完成,允许写入器向FIFO发送更多行. 您可以使用lsof -p $$来验证每个点(不)打开的文件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |