bash - 使用超时触发器在 bash“读取”中丢失数据
问题描述
丢失数据让我有点惊讶。我猜退出状态会警告我有什么事情发生了,但是有没有办法恢复部分读取(如果有的话)?请注意,“foo”不会出现在输出中的任何位置。它被写入,读取超时等待整行,数据消失了。我想我可以使用退出状态重试。
$ ( exec 6< <(echo -n "foo";
sleep 2; echo bar);
read -t 0.5 -u 6 baz;
echo $?;
sleep 3;
read -u 6 baz2;
echo $?;
declare -p baz baz2 )
142
0
declare -- baz=""
declare -- baz2="bar"
解决方案
似乎是一个错误。我无法用 bash 5.1.8 重现这一点。
$ cat fd-6.bash
( exec 6< <(echo -n "foo";
sleep 2; echo bar);
read -t 0.5 -u 6 baz;
echo $?;
sleep 3;
read -u 6 baz2;
echo $?;
declare -p baz baz2 )
输出确实包含 foo。
$ bash fd-6.bash
142
0
declare -- baz="foo"
declare -- baz2="bar"
但是,bash 4.3 的行为确实像您描述的那样,因此您应该升级。
$ bash-4.3 fd-6.bash
142
0
declare -- baz=""
declare -- baz2="bar"
推荐阅读
- spring-boot - 如何模拟 Feign 客户端
- java - 程序类型已经存在:com.bumptech.glide.GeneratedAppGlideModule
- snmp - Snmpwalk 随机返回更少的变量(以 SNMPv2-MIB::snmpSetSerialNo.0 结尾)
- scala - 尝试使持久性参与者需要带有 RequiresMessageQueue 的自定义邮箱时出错
- php - “明显边缘”检测以获得距离
- python - 需要从用户输入添加代码但不确定如何
- python - Python Selenium Infinite Scroll - 重新抓取
- android - Android Studio 翻译编辑器不存在
- c++ - 如何让 CMake 在 Windows 上找到 freeglut?
- reactjs - 如何获取新数组 onClick?