부록

부록

실행할 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개의 이벤트 이후에 있을 것입니다.) 나는 이것이 waybar의 합리적인 출력이라고 믿습니다. 따라서 문제는 출력이 어떤 형식을 취해야 하는지(웨이바에만 해당될 수 있음) 또는 모듈 구성 방법에 있을 것으로 예상됩니다.

루프를 제거 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 )

이는 한 번에 한 줄씩 출력을 읽고 alsactl매번 관련 정보를 추출합니다 amixer(그리고 의 줄은 무시합니다 alsactl). 또한 음소거된 경우에도 볼륨을 볼 수 있도록 sed 라인을 조정했지만 이는 단지 장식일 뿐입니다.

alsactl출력이 포함된 파이프가 절대로 손상되지 않기 때문에 이것이 작동하기를 바랍니다 . 원본 스크립트에서는 grep각 줄 뒤에서 종료되어 파이프라인이 중단됩니다. 어떻게든 이는 분리 alsactl( SIGCHLDWaybar의 디버그 출력에 나타나는 파일 전송)하고 스크립트를 중단합니다(그러나 비대화형 모드에서만). 최신 스크립트에서는 alsactl종료할 때까지 while 루프에 계속 파이프를 연결합니다.

관련 정보