실행할 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
( SIGCHLD
Waybar의 디버그 출력에 나타나는 파일 전송)하고 스크립트를 중단합니다(그러나 비대화형 모드에서만). 최신 스크립트에서는 alsactl
종료할 때까지 while 루프에 계속 파이프를 연결합니다.