dbus-monitorの出力で特定の文字列が見つかるたびにタイムスタンプ(ファイルに書き込まれる)を生成するBASHスクリプトを作成しようとしています(パラメータは後で指定します)。私のスクリプトの主な目的は、通知を使用するため、Spotifyで曲が再生され始める時間(ミリ秒を含む)と日付を節約することです。
string "Spotify"
曲が再生されるたびに、次のコマンドが出力されます。
dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' | grep 'string "Spotify"'
私の試み:
search='string "Spotify"'
found=$(dbus-monitor --session interface='org.freedesktop.Notifications',member='Notify' | grep 'string "Spotify"')
while [ ${search} == ${found} ]; do
date -u +%Y%M%d-%H%M%S.%N >> timestamp.txt
done
コード機能障害の原因は、dbus-monitor が引き続き実行され、while ループの実行をブロックするためであると仮定します。
ベストアンサー1
awk
代わりに使用してくださいgrep
。次のようになります。
dbus-monitor ... | awk '/Spotify/ {
system("date -u +%Y%m%d-%H%M%S.%N >> timestamp.txt")
}'
(月以外の間、-Mの%Y%m%d
代わりに大文字Mが使用されます。CAPS-Dは同じです。)%Y%M%D
%m/%d/%y
これは、入力に「Spotify」が表示されるたびに、awkのsystem()
機能を使用してサブシェルでdateコマンドを実行します。または、awkに組み込まれている日付形式とリダイレクトを使用してください。
dbus-monitor ... | awk '/Spotify/ {
print strftime("%Y%m%d-%H%M%S") >> "timestamp.txt"
}'
strftime()
このバージョンはサポートされていないため、タイムスタンプにナノ秒を印刷しません%N
。
または、awkの代わりにperlを使用してください。これによりPerlを使用できます。デスクトップ::通知通知を受け取るためのモジュールまたはネットワーク::DBusdbusと直接通信してください。