Как отслеживать изменения в файле

Существует несколько подходов к обновлению пакета до более новой версии, которая еще не упакована, без риска того, что обновленная версия будет перезаписана новым пакетом:

  • упакуйте новую версию самостоятельно или соберите обновленный исходный пакет (в этом случае в Ubuntu есть пакет версии 0.36 );
  • удалить пакет и установить из исходного кода.

Первый гораздо больше «похож на Debian -».

Однако в вашем конкретном случае лучшим решением может быть полное прекращение использования xf86-input-wacom:libinputподдерживает сенсорные экраны Wacom и имеет улучшенную поддержку мультитач. Он будет автоматически обрабатывать сенсорный экран после удаления драйвера Wacom.

Если libinputне работает, лучший способ получить обновленный драйвер Wacom, не прибегая к FrankenDebian, — пересобрать драйвер:

  • установить некоторые инструменты, которые нам понадобятся

    sudo apt install build-essential devscripts
    
  • получить исходный пакет Ubuntu

    dget -ux https://launchpad.net/ubuntu/+archive/primary/+sourcefiles/xf86-input-wacom/1:0.36.1-0ubuntu2/xf86-input-wacom_0.36.1-0ubuntu2.dsc
    
  • перейти в извлеченный каталог

    cd xf86-input-wacom*
    
  • создайте пакет для представления зависимостей сборки (это упростит очистку)

    mk-build-deps debian/control
    
  • установить

    sudo apt install./*build-deps*.deb
    
  • убрать с дороги

    mv./*build-deps*.deb..
    
  • собрать пакет

    dpkg-buildpackage -us -uc
    
  • установить сгенерированные пакеты

    sudo debi
    
  • очистить

    sudo apt --autoremove purge xf86-input-wacom-build-deps xserver-xorg-input-wacom-dbgsym
    
2
11.11.2020, 02:51
3 ответа

Я хотел бы поделиться скелетом кода. Вы можете расширить эту идею.

#!/bin/bash 

# monitor_changes
#
#     notifies changes to FILE passed as first parameter $1
#     uses tail -1 to return last line of the file

# first run -- save last line on variable old
old=$(tail -1 $1) 

# infinite loop 
while : ; do
    sleep 1
    # read again last line
    new=$(tail -1 $1) 

    # this is where the magic should happen
    [[ "$old" != "$new" ]] && echo "NOTIFY: $old --> $new"

    # save for next round
    old=$new
done

2
18.03.2021, 22:50

inotify, чтобы поймать (потенциальные )изменения. То, что файл изменен, не означает, что он изменен.

makeдля изменения файла. Он работает с датой файла, поэтому он должен быть надежным. Вам также нужен выходной файл, это может быть фиктивный файл, который вы создаете после записи на экран.

Другие инструменты для выполнения второй части :, например. Использование хэшей файлов (вместо дат ), если файл небольшой, сохранение копии и использование cmp.

пример использования

#!/bin/bash

while true
do
    inotify-wait --event modify source-file.txt
    make $(basename source-file.txt).stamp
    #there is a race hazard here: if the file changes again before we get back to the wait, then it may not be picked up.
done
# A make file template
%.stamp: %.txt
«tab» do_it $<
«tab» touch $@

Замените «вкладка» на вкладку. Замените do_itкодом, который это делает. $<будет заменено именем исходного файла -.

1
18.03.2021, 22:50

В общем случае вы хотите отслеживать файл и отправлять уведомление на рабочий стол с новым содержимым файла только тогда, когда содержимое изменилось, вы можете использоватьinotifywait(изinotify-tools-m, --monitorвариант исполнения на неопределенный срок.

--format "%e"будет печатать только тип события для следующей команды.

notify-send, из libnotify для уведомлений на рабочем столе, используется для отправки уведомления только в случае изменения содержимого файла.

#!/bin/bash

f="filename"
curr=$(<"$f")

inotifywait -m -e modify "$f" --format "%e" | while read -r event; do
    if [ "$event" == "MODIFY" ]; then
        prev="$curr"
        curr=$(<"$f")
        [ "$curr" == "$prev" ] || notify-send "Title" "$curr"
    fi
done

В вашем конкретном случае я бы не стал отслеживать изменения в файлах, если вашей целью является отображение уведомления на рабочем столе с текстом типа «вы подключены» или «вы отключены». Я бы изменил место, где вы печатаете этот текст (каждые N секунд, как вы говорите )в этот файл, на что-то вроде этого:

while true; do
    prev="$curr"
    curr=$( <here you output the new text> )
    [ "$curr" == "$prev" ] || notify-send "Title" "$curr"
    sleep 4
done
3
18.03.2021, 22:50

Теги

Похожие вопросы