Вопрос или проблема
Я хочу выйти из скрипта, если будет нажата любая клавиша.
#!/bin/sh
while true; do
df -h | head
sleep 10
clear
done
Есть какие-нибудь предложения?
Лучше использовать команду watch
:
watch -n10 'df -h | head'
Используйте Ctrl+c для остановки команды.
Страница руководства по watch
говорит:
watch – периодический запуск программы с отображением вывода на весь экран
Замените sleep 10;
на read -t 10 -n 1 exitwhile; if [ -n "$exitwhile" ]; then break; fi
read -t 10 -n 1 exitwhile
ждет 10 секунд для ввода без подтверждения клавишей enter и помещает ввод в переменную exitwhile. Если эта переменная не пустая, то цикл while прервется.
…но это нужно модифицировать, потому что она будет прерываться только на символах клавиш
Это выйдет при нажатии почти любой клавиши:
#!/bin/bash
while true; do
{ clear; df -h | head; } </dev/null
read -n 1 -t 10 && break
done; read -t 0.1 -n 1000000
Примечания:
- Шебанг вызывает
bash
, а неsh
, из-заread -n
. - Перенаправление из
/dev/null
необходимо, чтобы предотвратить исчерпание stdin командами, кромеread
(командыclear
иdf
могут этого не делать, но в общем команды могут). Таким образом, любой ввод в конечном итоге идет вread
. - Последний
read
предназначен для отбрасывания избыточных символов из stdin. Некоторые клавиши генерируют более одного символа (поиск “последовательности управляющих символов”); также возможно нажимать несколько клавиш, пока выполняетсяdf
(или любая другая команда, которую вы хотите использовать). Без последнегоread
эти лишние символы будут засорять вашу командную строку.
Альтернативный подход с watch
:
#!/bin/bash
watch -n 10 df -h & # отправить в фоновый режим
read -n 1
kill $! # убить задачу, которая была помещена в фоновый режим последней
read -t 0.1 -n 1000000
Ответ или решение
Если вы хотите завершить выполнение скрипта при нажатии любой клавиши, можно использовать несколько подходов в Bash. Рассмотрим несколько решений, которые помогут вам достичь желаемого результата, каждый из которых имеет свои особенности.
1. Использование простого цикла с read
Первый метод включает использование комбинации команд read
и циклов. Этот подход позволяет вам продолжать выполнять запрос df -h
каждые 10 секунд, но при этом будет проверять, была ли нажата клавиша.
#!/bin/bash
while true; do
{ clear; df -h | head; } < /dev/null
read -n 1 -t 10 && break
done
read -t 0.1 -n 1000000
Объяснение:
while true; do
: Запускает бесконечный цикл.{ clear; df -h | head; } < /dev/null
: Очистка экрана и вывод первой части списка файловой системы, игнорируя ввод с клавиатуры.read -n 1 -t 10
: Ожидает одно нажатие клавиши в течение 10 секунд. Если клавиша нажата, цикл прерывается.read -t 0.1 -n 1000000
: Удаляет все лишние символы из стандартного ввода после завершения цикла.
Плюсы:
- Легкость реализовать и использовать.
- Интуитивно понятный подход.
Минусы:
- При наличии последовательных нажатий клавиш во время выполнения команды
df
, возможно, потребуется дополнительная обработка для предотвращения загрязнения стандартного ввода.
2. Альтернативный подход с watch
Другой способ – это использование команды watch
, которая будет выполнять df -h
каждые 10 секунд в фоновом режиме, пока вы ожидаете нажатия клавиши.
#!/bin/bash
watch -n 10 df -h & # Запускаем в фоновом режиме
read -n 1 # Ждем нажатия клавиши
kill $! # Убиваем процесс, запущенный в фоновом режиме
read -t 0.1 -n 1000000 # Чистим лишние символы
Объяснение:
watch -n 10 df -h &
: Запускает командуdf -h
каждые 10 секунд в фоновом режиме.read -n 1
: Ожидает нажатия клавиши.kill $!
: Убивает последний запущенный в фоновом режиме процесс (watch
).
Плюсы:
- Простота и удобство, так как использование
watch
уже реализует некоторые функции паузы и обновления вывода. - Вывод будет аккуратным и чистым.
Минусы:
- Необходимость использования фоновых процессов может усложнить отладку в случае ошибок.
Заключение
Каждый из предложенных методов позволит вам выйти из цикла при нажатии любой клавиши. Выбор решения зависит от ваших предпочтений: если вы хотите более простой и понятный скрипт, воспользуйтесь первым методом. Если же вам важна работа в фоне и возможные дополнительные функции, выбирайте подход с watch
.
Не забывайте проверять выполнение ваших скриптов на различных системах, так как некоторые команды могут вести себя по-разному в зависимости от используемой оболочки.