![Openbox - &를 사용하여 한 번의 키 입력으로 여러 명령을 구분합니다.](https://linux55.com/image/93734/Openbox%20-%20%26amp%3B%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%95%9C%20%EB%B2%88%EC%9D%98%20%ED%82%A4%20%EC%9E%85%EB%A0%A5%EC%9C%BC%EB%A1%9C%20%EC%97%AC%EB%9F%AC%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EA%B5%AC%EB%B6%84%ED%95%A9%EB%8B%88%EB%8B%A4..png)
Openbox를 구성하려고 합니다.rc.xml파일을 클릭 한 번으로 내 사운드 카드를 작동시킬 수 있습니다. 시스템에 사운드 카드가 여러 개 있어서 동시에 여러 개의 수신기를 작동해야 하므로 여러 명령을 로 구분하여 사용합니다.&이와 같이:
<keybind key="XF86AudioRaiseVolumen">
<action name="Execute">
<command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5% & pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5% & pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%</command>
</action>
</keybind>
어떤 이유로 rc.xml에서는 작동하지 않습니다. 누가 날 도울 수 있죠?
답변1
명령을 쉘 스크립트에 넣고 스크립트를 실행 가능하게 만든 다음 스크립트를 명령으로 사용해야 합니다.
<command>/usr/local/bin/volume_up</command>
콘텐츠/usr/local/bin/volume_up
#!/bin/sh
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5% &
pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5% &
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%
그리고 실행 가능하게 만드세요
chmod +x /usr/local/bin/volume_up
그 이유는 Openbox가 쉘에서 command 요소의 내용을 실행하는 대신 직접 실행하려고 하기 때문입니다.
실행할 명령과 이에 전달될 인수인 문자열입니다. "~" 물결표 문자는 홈 디렉토리로 확장되지만 sh 명령에 전달되지 않는 한 다른 쉘 확장이나 스크립트 구문을 명령에 사용할 수 없습니다. 또한 올바른 구문 분석을 위해 & 문자를 &로 작성해야 합니다. 예, 더 이상 사용되지 않는 이름입니다.
또 다른 이점은 볼륨을 낮추기 위해 스크립트를 다시 작성할 수 있다는 것입니다.
#!/bin/sh
change_volume() {
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output "$1"
pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo "$1"
pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 "$1"
}
main() {
case "$1" in
up)
change_volume +5%
;;
down)
change_volume -5%
;;
*)
printf "volume <command>\n"
printf " up \n"
printf " down\n"
esac
}
main "$@"
아래에 저장되어 /usr/local/bin/volume
이렇게 사용됩니다.
<command>/usr/local/bin/volume up</command>
<command>/usr/local/bin/volume down</command>
답변2
순서와 이 모든 것이 거의 동시에 실행된다는 사실에 신경 쓰지 않는다면 다음을 수행할 수 있습니다.
<keybind key="XF86AudioRaiseVolumen">
<action name="Execute">
<command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.multichannel-output +5%</command>
</action>
<action name="Execute">
<command>pactl set-sink-volume alsa_output.pci-0000_00_1b.0.analog-stereo +5%</command>
</action>
<action name="Execute">
<command>pactl set-sink-volume alsa_output.usb-Focusrite_Scarlett_2i4_USB-00.analog-surround-40 +5%</command>
</action>
</keybind>
답변3
모든 구성 요소의 볼륨을 늘리거나 줄이는 바인딩을 만들었으므로 원하는 구성 요소가 영향을 받는지 확인할 수 있고, 무언가를 비활성화하려면 음소거하면 됩니다.
<keybind key="XF86AudioRaiseVolume">
<action name="Execute">
<command>bash -c "pactl list | grep -oP 'Sink #\K([0-9]+)' | while read -r i ; do pactl -- set-sink-volume $i +3% ; done"</command>
</action>
</keybind>
<!-- decrease volume -->
<keybind key="XF86AudioLowerVolume">
<action name="Execute">
<command>bash -c "pactl list | grep -oP 'Sink #\K([0-9]+)' | while read -r i ; do pactl -- set-sink-volume $i -3% ; done"</command>
</action>
</keybind>
답변4
귀하의 사용 사례에 대해 이것이 더 깨끗하고 짧을 것이라고 생각합니다.
<keybind key="XF86AudioLowerVolume">
<action name="Execute">
<command>sh -c "pactl list sinks | grep 'Sink #' | cut -d'#' -f2 | xargs -I@ pactl -- set-sink-volume @ -2000"</command>
</action>
</keybind>
<keybind key="XF86AudioRaiseVolume">
<action name="Execute">
<command>sh -c "pactl list sinks | grep 'Sink #' | cut -d'#' -f2 | xargs -I@ pactl -- set-sink-volume @ +2000"</command>
</action>
</keybind>
모든 싱크와 각각의 증가/감소된 볼륨이 나열됩니다. 예를 들어 잭이나 Bluetooth 스피커가 연결되어 있으면 둘 이상이 있을 것입니다. 이것이 바로 제가 사용하고 있는 설정입니다.