bash - 使用超时触发器在 bash 'read' 中丢失数据

标签 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"

关于bash - 使用超时触发器在 bash 'read' 中丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51921849/

相关文章:

linux - 带文件路径参数的 Windows 10 Bash 和 Google Chrome

bash - Makefile 匹配任何目标/任务

python - 如何使用 sed -n 但在 Python 中从文本文件中提取一系列行?

linux - 将字符串从右侧修剪到第 4 个分隔符

python - 在 python 中导出环境变量后 import 不起作用

linux - 在 Bash 中将文件从 2 个文本文件移动到位置

BASH:如何删除 list 中指定的文件以外的所有文件?

git - Git Bash 和 GitHub for Windows shell 有什么区别?

bash - 如何在 Bash 中替换文件每行中除最后 n 个实例之外的所有字符实例

linux - 用于移动文件及其父目录的 Bash 脚本