gpt4 book ai didi

bash - 在 shell 脚本中使用 mkfifo

转载 作者:行者123 更新时间:2023-11-29 09:03:40 32 4
gpt4 key购买 nike

我试图用 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 时,此时没有人写入它,所以 read block 。

随着 while FIFO 在 while 之前一直开放供读取命令完成,允许编写器向 FIFO 发送更多行。

您可以使用 lsof -p $$验证在每个点打开(未打开)的文件。

关于bash - 在 shell 脚本中使用 mkfifo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23088620/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com