Openbox -& を使用して、1 つのキーストロークで複数のコマンドを区切ります。

Openbox -& を使用して、1 つのキーストロークで複数のコマンドを区切ります。

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要素の内容を実行するのではなく、直接実行しようとするためです。

~から出荷書類ビーチ<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スピーカーが接続されている場合は、複数があります。これが私が使っている設定です。

関連情報