ファイル内のコンテンツの変更を監視し、コンテンツが変更されたときに新しいテキストを表示する通知を生成したいと思います。
詳細
file(connection.txt
)には単語のみが含まれているとします"You are connected to the internet"
。
ただし、コンピュータのインターネット接続が失われると、ファイルの内容が"You are now disconnected from the internet"
。
ファイルの内容を監視し、内容が変更されたときにのみデスクトップ通知に新しいテキストを表示するにはどうすればよいですか(Manjaroを使用しています)。
悪いことに、ファイルは4秒ごとに更新され、しばしばまったく同じテキストが含まれます。
私の研究
私はこの問題に対する解決策を見つけましたが、役に立ちませんでした。ファイルの作成、変更、削除など、ファイルやディレクトリイベントへの変更を監視するケースはたくさんありましたが、ファイル内のテキストをリアルタイムで監視するケースはありませんでした。
可能であれば、コマンド出力の変更を監視する同様の技術はありますか?
答え1
ファイルを監視し、内容が変更されたときに新しいファイルの内容を含むデスクトップ通知のみを送信したい場合は、inotifywait
(from inotify-tools
)と-m
オプション--monitor
を使用してこの操作を無期限に実行できます。
--format "%e"
次のコマンドはイベントタイプのみを印刷します。
notify-send
から図書館通知デスクトップ通知の場合、ファイルの内容が変更された場合にのみ通知を送信するために使用されます。
#!/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
答え2
一つ共有したい頭蓋骨パスワード。このアイデアを拡張できます。
#!/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
答え3
inotify
(潜在的な)変更をキャプチャします。ファイルが変更されたとしても、ファイルが変更されたという意味ではありません。
make
ファイル変更動作。ファイルの日付で動作するため、信頼できる必要があります。出力ファイルも必要です。これは、画面に書き込んだ後に生成するダミーファイルです。
2番目の部分を完成させる別のツール:たとえば、日付の代わりにファイルハッシュを使用し、ファイルが小さい場合はコピーを保持します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
これを行うコードに置き換えます。$<
ソースファイル名に置き換えられます。