Bash 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

Я хотел бы завершить цикл, в то время как содержит его вывод, используя, например, мой ключ ввода или любой другой. Однако, если я использую чтение, он будет ждать моего ввода и удерживать таймер.

Как сохранить цикл работающим, пока я не нажму любую клавишу, сохраняя вывод?

Редактировать: Пока я на это.. Можно ли записать последний вывод в файл перед выходом?

1 ответ

Добавление к ответу 123, так как я не могу комментировать. Вместо того, чтобы использовать

kill %1

использование

kill $!

поскольку в оболочке может быть несколько других заданий, kill %1 может также уничтожать и другие задания, так что для повышения гибкости $! может быть использован.

$! вернет идентификатор процесса последней функции, запущенной в текущей оболочке.

Запустите цикл в фоновом режиме с помощью &

Затем приостановить функцию с чтением.

Пишите и убивайте, когда нажата клавиша Enter.

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 $!
}
Другие вопросы по тегам