‘Приостановить’ цикл ‘while’ в Bash

#bash #e-ink

#bash #e-ink

Вопрос:

Я закодировал скрипт Bash для Kobo eReaders (https://github.com/tux-linux/Kobo-network-display-viewer ), который отображает на нем экран компьютера на базе Linux. Вот приблизительное резюме того, как это работает:
1. Gnome-screenshot делает скриншоты экрана в реальном времени, которые помещаются в /tmp и постоянно заменяются.
2. Скриншот отправляется через SCP, SSH в каталог /tmp Kobo, в котором размещена небольшая система Linux.
3. Я использую библиотеку для отображения изображения на экране:https://github.com/NiLuJe/FBInk

4. Процесс начинается снова, что приводит к постоянному (настолько постоянному, насколько я мог бы это описать) обновлению изображения на экране eInk.

Что ж, кажется, все в порядке. Но проблема, с которой я сталкиваюсь, заключается в том, что экран eInk имеет срок службы. И когда экран eInk постоянно обновляет, секунда за секундой, изображение на экране, в какой-то момент это неизбежно (я думаю) приведет к некоторому износу. Но большим плюсом этих экранов является то, что если вы оставите на них неподвижное изображение, оно не будет изнашиваться, за исключением времени, необходимого для его отображения.
Итак, что я хотел бы сделать, это ‘перехватить’ или ‘приостановить’ процесс ‘while’ (код приведен ниже), когда скриншоты хост-машины совпадают, чтобы по-прежнему отображать изображение на экране (которое останется там из-за экрана eInk), но оставить его там и не обновлять его, пока ‘diff’ или подобная команда не найдет в нем разницу.

Я немного новичок в программировании на Bash, поэтому буду признателен за любую помощь. Вот код:

 while :; do read -r -p 'IP: ' ip amp;amp; break; done
while :; do read -r -p "Your Kobo device screen width resolution: " width amp;amp; break; done
while :; do read -r -p "Your Kobo device screen height resolution: " height amp;amp; break; done
    sshpass -p test ssh root@$ip 'watch -n 30 "fbink -H -k -f | tee -a output.txt" amp;>/dev/null amp;'
    while true; do gnome-screenshot -p --file=/tmp/continuous.png amp;amp; sshpass -p test scp /tmp/continuous.png root@$ip:/tmp amp;amp; sshpass -p test ssh root@$ip 'fbink -g file=/tmp/continuous.png,w='$width',h='$height''; done
  

К вашему сведению, суть ‘fbink -k -f’ в том, чтобы обновлять экран каждые 30 секунд.

Спасибо за ваше время!

Комментарии:

1. Вставьте sleep куда-нибудь, например sleep 0.250 .

2. Я вижу здесь 2 основных вопроса: 1) «когда … скриншоты те же» ; 2) «оставьте его там и не обновляйте до тех пор, пока мышь не переместится или отображение часов не изменится на компьютере. . Это правильно? Решает ли ваш текущий код # 1? Вы действительно ищете идеи о # 2? Если это так, это кажется очень сложным. Планируете ли вы использовать одно и то же программное обеспечение для «дифференцирования» изображений для «изменения отображения часов» и отдельно использовать какой-либо другой механизм для «пока мышь не переместится» ? Ни одно из этих действий не является простым, и ни одно из них на самом деле не является функцией, которую вы найдете в сценариях оболочки. Попробуйте перефразировать вашу проблему выше

3. Выполнено. Не стесняйтесь задавать мне другие вопросы, если вы сомневаетесь.

4. Если вы берете контрольную сумму ( md5sum / etc) двух «идентичных» скриншотов, совпадают ли они? Если они не совпадают, выполните двоичное различие: где различия? Они только в заголовке? Можете ли вы просто пропустить заголовок и затем выполнить побайтовое сравнение?

5. Кстати, я не уверен, что этот вопрос имеет какое-либо отношение к циклам «приостановки». Возможно, было бы лучше спросить, как сравнить два изображения или как пропустить команду, если одно изображение совпадает с предыдущим, или так далее. Но в любом случае — проблему, которую вы пытаетесь решить, можно было бы разобрать подробнее, чтобы то, что вы задаете здесь, было как можно более узким и конкретным .