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

Я написал сценарий оболочки для тестирования API, который копирует файлы и повторяет их прогресс после каждого.

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

Как я могу добавить это как можно меньше строк?

Вам не нужно добавлять что-то в свой скрипт. Оболочка допускает такую ​​функциональность.

  • Запустите свой скрипт в терминале.
  • Пока работает и блокировка терминала использует ctrlz . Терминал снова освобождается, и вы видите сообщение о том, что процесс остановлен. (Сейчас он находится в состоянии передачи, T , остановлен)
  • Теперь сделай все, что хочешь. Вы также можете запускать другие процессы / скрипты и останавливать их с помощью ctrl- z .
  • Введите jobs в терминал или перечислите все остановленные задания.
  • Чтобы продолжить выполнение скрипта, введите fg (передний план). Он возобновляет работу обратно в группу процессов переднего плана, и задания продолжают выполняться.

См. Пример:

 root@host:~$ sleep 10 # sleep for 10 seconds ^Z [1]+ Stopped sleep 10 root@host:~$ jobs # list all stopped jobs [1]+ Stopped sleep 10 root@host:~$ fg # continue the job sleep 10 root@host:~$ # job has finished 

Если вы хотите просто приостановить сценарий, оставаясь внутри скрипта, вы можете использовать чтение вместо сна.

Вы можете использовать

read -t установить тайм-аут для чтения
read -n чтобы прочитать один символ (фактически просто нажмите любую клавишу), чтобы продолжить сценарий

Поскольку вы не указали какой-либо код, ниже приведен пример того, как его можно использовать.
Если q нажата, то read -n1 предотвращает продолжение скрипта до нажатия клавиши.
Когда клавиша нажата, проверка будет сброшена, и сценарий будет продолжаться в цикле, как обычно.

 while [[ true ]]; do read -t2 -n1 check if [[ $check == "q" ]];then echo "pressed" read -n1 check="" else echo "not pressed" fi echo "Doing Something" done 

Вы также можете добавить stty -echo в начало раздела и stty echo до конца, чтобы не допустить ввода текста из-за выхода из экрана

С dd вы можете надежно прочитать один байт из файла. С помощью stty вы можете установить min количество байтов, чтобы квалифицировать считывание терминала и time аут в десятые доли секунды. Объедините эти два, и вы можете обойтись без sleep , я думаю, и просто дайте тайм-ауту чтения терминала сделать для вас работу:

 s=$(stty -g </dev/tty) (while stty raw -echo isig time 20 min 0;test -z "$( dd bs=1 count=1 2>/dev/null; stty "$s")" || (exec sh) do echo "$SECONDS:" do your stuff here maybe echo no sleep necessary, I think [ "$((i+=1))" -gt 10 ] && exit done ) </dev/tty 

Это небольшой пример цикла, который я издевался над вами, чтобы попробовать. Каждые две секунды разыгрывается при попытке прочитать stdin – перенаправлено из /dev/tty – и петли while while. Это или dd не тайм-аут, потому что вы нажимаете клавишу – в этом случае вызывается интерактивная оболочка.

Вот тестовый прогон – числа, напечатанные в начале каждой строки, являются значением переменной оболочки $SECONDS :

 273315: do your stuff here maybe no sleep necessary, I think 273317: do your stuff here maybe no sleep necessary, I think 273319: do your stuff here maybe no sleep necessary, I think 273321: do your stuff here maybe no sleep necessary, I think sh-4.3$ : if you press a key you get an interactive shell sh-4.3$ : this example loop quits after ten iterations sh-4.3$ : or if this shell exits with a non-zero exit status sh-4.3$ : and speaking of which, to do so you just... sh-4.3$ exit exit 273385: do your stuff here maybe no sleep necessary, I think 273387: do your stuff here maybe no sleep necessary, I think 273389: do your stuff here maybe no sleep necessary, I think 273391: do your stuff here maybe no sleep necessary, I think 273393: do your stuff here maybe no sleep necessary, I think 273395: do your stuff here maybe no sleep necessary, I think 273397: do your stuff here maybe no sleep necessary, I think