Вы можете выбрать символ, который вряд ли появится в вашем текстовом файле, добавить родительское имя + этот символ к каждой дочерней строке, отсортировать, а затем удалить родительское имя и разделитель из каждой дочерней строки, например. с 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/
- поменять местами строки в пространство шаблонов, заменяя \n
ewline на \x02
после этого, sort
и удаляя все до \x02
включительно со вторым sed 's/.*\x02//'
Вам нужно поместить команды в сценарий оболочки, сделать этот сценарий исполняемым и затем использовать этот сценарий в качестве команды.
<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>
Если вас не смущает порядок и тот факт, что все это будет выполнено более или менее одновременно, вы можете сделать:
<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>
Я думаю, это было бы чище и короче для вашего варианта использования:
<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, их будет несколько. Это именно та установка, которую я использую.
Я создал привязку, которая увеличивает/уменьшает громкость для всех компонентов, таким образом, вы будете уверены, что желаемый компонент будет затронут, если вы хотите отключить какой-либо компонент, просто отключите его.
<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>