【问题标题】:Bash break while loop by user input用户输入的Bash break while循环
【发布时间】:2016-05-20 13:19:25
【问题描述】:

我得到了一个小秒表,我用以下代码将它放入 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 它会等待我的输入并保持计时器。

如何保持循环运行直到我按下任何键仍然保留输出?

编辑:当我在它的时候.. 是否可以在退出前将最后一个输出写入文件?

【问题讨论】:

    标签: bash loops input while-loop break


    【解决方案1】:

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

    kill %1
    

    使用

    kill $!
    

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

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

    使用 & 在后台运行循环

    然后用 read 暂停函数。

    按下回车时写入并杀死。

    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 $!
    }
    

    【讨论】:

    • 这种包含输出。看起来像这样:~$ stopwatch test test [1] 3606 00:00:04
    猜你喜欢
    • 2013-11-16
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    相关资源
    最近更新 更多