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