Openbox - 一次按键可使用 & 分隔多个命令

Openbox - 一次按键可使用 & 分隔多个命令

我正在尝试配置 Openboxrc.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

您需要将命令放入 shell 脚本中,使该脚本可执行,然后使用该脚本作为命令。

<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 没有在 shell 中执行命令元素的内容,而是尝试直接执行它。

来自的文档<command>

一个字符串,它是要执行的命令以及要传递给它的任何参数。 “~”波浪号字符将扩展到您的主目录,但命令中不能使用其他 shell 扩展或脚本语法,除非将它们传递给 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>

它将列出所有水槽以及每个增加/减少的音量。例如,当您连接了插孔或蓝牙扬声器时,将会有多个。这正是我正在使用的设置。

相关内容