
実行するbashスクリプトを作成しました。ナビゲーションバーカスタマイズされたモジュール。これを無限ループとして使用しようとしていますが、カスタムモジュールは更新されません。
私のスクリプト(volume.sh
)は端末でよく見えます。 (参考として:
#!/bin/bash
# Loop forever
while : ; do
# Mangle the output of amixer into json
amixer get Master | grep 'Mono:' |\
sed -nre 's/.*\[off\].*/\{"text": " M x ", "class": "muted", "percentage": 0\}/p; s/.*\[(.*)%\].*/\{"text": "\1% ", "class": "unmuted", "percentage": \1\}/p'
# Wait until the next alsa event
/usr/sbin/alsactl monitor | grep -m 0 .
# Exit if alsactl monitor was interrupted
if (( ${PIPESTATUS[0]} != 141 )); then
break;
fi
done
)私のウェーバー構成は次のとおりです。
"custom/alsa": {
"exec": "~/.config/waybar/volume.sh",
"return-type": "json",
"on-click": "amixer set Master toggle",
"on-scroll-up": "amixer set Master 5+",
"on-scroll-down": "amixer set Master 5-",
"tooltip": false
}
ウェーバーを起動すると、カスタムモジュールが正しく表示されますが、更新されません。
./volume.sh
ターミナルは、音量が変わるかミュート/ミュート解除されるたびにラインを出力します。これが私が望むものです。端末の出力は正しく表示されます。
$ ./volume.sh
{"text": "43% ", "class": "unmuted", "percentage": 43}
{"text": "50% ", "class": "unmuted", "percentage": 50}
{"text": " M x ", "class": "muted", "percentage": 0}
{"text": "57% ", "class": "unmuted", "percentage": 57}
(これは4つのイベントの後にあるでしょう。)私はこれがウェイバーの合理的な出力だと思います。したがって、問題は、出力がどのような形式を取るべきか(ウェーバーに固有の可能性があります)、またはモジュールの構成方法にあると予想されます。
ループを削除しvolume.sh
て間隔をカスタムモジュール構成に配置すると、モジュールは正しく更新されますが、ポーリングは避けたいと思います。
私のカスタムWaybarモジュールが更新されないのはなぜですか?ありがとうございます!
付録
興味の場合、出力は次のamixer get Master
ようになります。
Simple mixer control 'Master',0
Capabilities: pvolume pvolume-joined pswitch pswitch-joined
Playback channels: Mono
Limits: Playback 0 - 74
Mono: Playback 49 [66%] [-25.00dB] [on]
しかし、スクリプトのテキスト出力は正しいように見えるので、そのamixer
行は問題にならないようです。
答え1
原因を推測する効果的なソリューションがあります。
作業ソリューションは
#!/bin/bash
set -e
createJson(){
amixer get Master |
grep 'Mono:' |
sed -nre 's/.*\[(.*)%\].*\[off\].*/\{"text": "\1% x", "class": "muted", "percentage": \1\}/p'\
-e 's/.*\[(.*)%\].*/\{"text": "\1% ", "class": "unmuted", "percentage": \1\}/p'
}
createJson
while read line; do
createJson
done < <( /usr/sbin/alsactl monitor )
これは一度に1行ずつ出力を読み取り、alsactl
毎回関連情報を抽出しますamixer
(そして行は無視されますalsactl
)。また、ミュートされていても音量を確認できるようにsedラインを調整しましたが、これは単なる装飾です。
alsactl
出力を含むパイプが決して損傷しないので、これがうまくいくことを願っています。元のスクリプトでは、grep
各行の後で終了し、パイプラインが中断されます。どういうわけかこれを分離しalsactl
(SIGCHLD
Waybarのデバッグ出力に表示されるファイル転送)、スクリプトを中断します(しかし非対話モードでのみ)。最新のスクリプトでは、alsactl
終了するまでwhileループにパイプを接続し続けます。