Openbox - несколько команд, разделенных & для одного нажатия клавиши

Вы можете выбрать символ, который вряд ли появится в вашем текстовом файле, добавить родительское имя + этот символ к каждой дочерней строке, отсортировать, а затем удалить родительское имя и разделитель из каждой дочерней строки, например. с gnu sed и низким символом ascii, например \x02

sed '/^[^[:blank:]]/h;//!G;s/\(.*\)\n\(.*\)/\2\x02\1/' infile | sort | sed 's/.*\x02//'

Как это работает:
первый sed делает следующее:
/^[^[:blank:]]/h - копирует строки без отступа (родители) поверх пробела
//!G - в строках с отступом (дочерних) добавить содержимое пробела в пространство шаблона
s/\(.*\)\n\(.*\)/\2\x02\1/ - поменять местами строки в пространство шаблонов, заменяя \newline на \x02
после этого, sort и удаляя все до \x02 включительно со вторым sed 's/.*\x02//'

0
03.09.2016, 11:50
4 ответа

Вам нужно поместить команды в сценарий оболочки, сделать этот сценарий исполняемым и затем использовать этот сценарий в качестве команды.

<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 не выполняет содержимое командного элемента в оболочке, а пытается его выполнить напрямую.

Из документации для :

Строка, которая представляет собой команду, которая должна быть выполнена, вместе с любыми аргументами , которые должны быть ей переданы. Символ тильды "~" будет заменен на ваш домашний каталог , но никакие другие расширения оболочки или синтаксис сценария не могут использоваться в команде, если они не переданы команде 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>
3
28.01.2020, 02:17

Если вас не смущает порядок и тот факт, что все это будет выполнено более или менее одновременно, вы можете сделать:

<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
28.01.2020, 02:17

Я думаю, это было бы чище и короче для вашего варианта использования:

<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>

В нем будут перечислены все приемники и для каждого увеличения/уменьшения громкости. Например, если у вас есть разъем jack или динамики bluetooth, их будет несколько. Это именно та установка, которую я использую.

0
28.01.2020, 02:17

Я создал привязку, которая увеличивает/уменьшает громкость для всех компонентов, таким образом, вы будете уверены, что желаемый компонент будет затронут, если вы хотите отключить какой-либо компонент, просто отключите его.

<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>
1
28.01.2020, 02:17

Теги

Похожие вопросы