付録

付録

実行する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各行の後で終了し、パイプラインが中断されます。どういうわけかこれを分離しalsactlSIGCHLDWaybarのデバッグ出力に表示されるファイル転送)、スクリプトを中断します(しかし非対話モードでのみ)。最新のスクリプトでは、alsactl終了するまでwhileループにパイプを接続し続けます。

おすすめ記事