Bash在用户输入时循环中断

时间:2016-02-10 09:15:27

标签: bash loops input while-loop break

我给了我一个小秒表,我把它放入bashrc中,代码如下:

stopwatch() {
    date1=`date +%s`
    echo $1
    while true; do
            echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r"
    done
}

输出看起来像这样,而时间只会在第二行计算:

~$ stopwatch test
test
00:00:04

现在,如果我要结束秒表,请按Ctrl + C,这样就可以了:

~$ stopwatch test
test
^C:00:03

我希望在使用例如输出包含其输出时结束循环。我的回车键或任何其他。 但是,如果我使用read,它会等待我的输入并保持计时器。

如果我按任何仍然保留输出的键,我如何保持循环运行?

编辑:我在这里.. 是否可以在退出之前将最后一个输出写入文件?

1 个答案:

答案 0 :(得分:3)

添加到123的回答,因为我无法发表评论。 而不是使用

kill %1

使用

kill $!

因为,shell上可能还有其他几个工作,kill%1也可以杀掉其他工作,所以要让它更灵活$!可以使用。

$!将返回当前shell上运行的最后一个函数的进程ID。

  

使用&

在后台运行循环      

然后暂停阅读功能。

     

按下回车时写入并终止。

stopwatch() {
date1=`date +%s`
echo $1
while true; do
        echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)\r"
done &
read
echo -ne "$(date -u --date @$((`date +%s` - $date1)) +%H:%M:%S)" > file
kill $!
}