Я хочу выйти из скрипта, если нажата какая-либо клавиша.

#!/bin/sh
while true; do
   df -h | head
   sleep 10
   clear
done

Любое предложение?

3 ответа3

0

Заменить sleep 10; с read -t 10 -n 1 exitwhile; if [ -n "$exitwhile" ]; then break; fi

read -t 10 -n 1 exitwhile Между тем, 10 секунд ожидает ввода без подтверждения ввода и помещает ввод в переменную exit. если эта переменная не пуста, цикл while прервется.

… Должен быть изменен, потому что он сломается только на символьных клавишах

0

Вам лучше использовать команду watch :

watch -n10 'df -h | head'

Используйте Ctrl+c, чтобы остановить команду.

Страница watch гласит:

watch - периодически запускать программу, показывая вывод в полноэкранном режиме

0

Это выйдет практически на любую клавишу:

#!/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 предотвращает исчерпание стандартного ввода командами, отличными от read (команды clear и df могут этого не делать, но в общем случае команды могут). Таким образом, любой вход в конечном итоге будет read .
  • Последнее read - отбрасывать лишние символы из stdin. Некоторые ключи генерируют более одного символа (исследуйте «escape-последовательности»); Также можно нажимать несколько клавиш во время работы df (или любой другой команды, которую вы хотите использовать). Без окончательного read эти лишние символы засорят вашу командную строку.

Альтернативный подход, с watch:

#!/bin/bash
watch -n 10 df -h &   # put to the background
read -n 1
kill $!               # kill the the job most recently placed into the background
read -t 0.1 -n 1000000

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .