我试图用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
[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
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 .
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.