首页 > 解决方案 > 使用超时触发器在 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

解决方案


似乎是一个错误。我无法用 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"

推荐阅读