读取文件时设置超时限制

时间:2017-09-23 10:37:38

标签: bash

我正在尝试编写一个逐行运行文件的基本脚本,直到达到时间限制。有没有办法在x timelimit之后停止read -r line?我尝试了-t 10 10秒的限制。我也尝试了一个while循环

man read -t似乎仅与timeout相关而非时间限制

file.txt包含超过150000行由新行分隔的随机字符

代码尝试1:

#!/bin/bash
file="./file.txt"
while IFS='' read -r -t 10 line ; do
    echo "$line"
done <"$file" #finished

代码尝试2:

#!/bin/bash
timelimit=10
file="./file.txt"
while [[ "$timelimit" -gt "0" ]] ; do
    sleep 1
    ((--timelimit))
    while IFS='' read -r line ; do
        echo "$line"
    done <"$file" #finished
done

代码尝试1失败,因为它没有限制器(只是一个超时设置)

代码尝试2失败,因为它运行递减然后下一个while循环并且不会重新进入,直到它完成一个完整的循环(15000行)

2 个答案:

答案 0 :(得分:3)

使用date +%s

查看此可能的解决方案
CURRENT_DATE=$( date +%s )
END_DATE=$(( CURRENT_DATE+10 ))

while [ $CURRENT_DATE -le $END_DATE ];
do
    read -r LINE
    if [ $? -ne 0 ];
    then
        break
        #exit from loop if file is over...
    fi
    CURRENT_DATE=$( date +%s )
    #update CURRENT_DATE...
done

上面提到的命令以epoch(1970年1月1日)为单位返回当前日期值。

答案 1 :(得分:1)

您可以使用内置变量SECONDS进行粗略控制。

SECONDS=0  # reset the counter
file="./file.txt"
while ((SECONDS < 10) && IFS= read -r line ; do
    echo "$line"
done <"$file" #finished  

假设每个read和循环体不会花费太长时间,循环将在开始后非常接近10秒后退出。