linux shell fifo使用,bash – 在shell脚本中使用mkfifo

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值