Я пытаюсь записать сценарий, который позволяет мне изменять объем Беспроводной колонки от оболочки. Я могу трудно кодировать значение приемника, и это работает просто великолепно:
#!/usr/bin/env bash
for level in "$@"
do
pactl set-sink-input-volume 267 $level
done
Я добираюсь эти "267" значение путем выполнения:
pactl list sink-inputs
Который обеспечивает вывод как:
Sink Input #267
Driver: protocol-native.c
Owner Module: 10
Client: 151
Sink: 7
Sample Specification: float32le 2ch 44100Hz
Channel Map: front-left,front-right
⋮
Все, о чем я забочусь, то, что три значения цифры в первой строке помещенного после Входа Приемника #
Как я сказал, если я hardcode, что 267 значений в сценарии, все хорошо работает, пока я не перезапускаю Беспроводную колонку, затем изменения значения.
Есть ли способ, которым я могу извлечь то значение с помощью сценария и передать его как переменную к pactl set-sink-input-volume 267 $level
бит сценария?
Существует два способа сделать это. Это все предполагает, что Вы хотите передать одно число сценарию в аргументах и изменить объем первого приемника к аргументу.
Ваш исходный предложенный путь (удаляют echo
после проверки, это работает):
#!/bin/bash
pactl list sink-inputs | grep -hPo '^Sink Input #\K\d+ Удаляют echo
, после того как Вы проверили, что команды, которые были бы выполнены, корректны.
Или, @steeldriver указывает в комментариях вопроса, существует short
форма, это быстрее и легче проанализировать (снова, удалить echo
):
#!/bin/bash
pactl list short sink-inputs | head -n 1 | awk '{print$1}' | xargs -n 1 -I{} echo pactl set-sink-input-volume "{}" "$1"
| head -n 1 | xargs -n 1 -I{} echo pactl set-sink-input-volume "{}" "$1"
Удаляют echo
, после того как Вы проверили, что команды, которые были бы выполнены, корректны.
Или, @steeldriver указывает в комментариях вопроса, существует short
форма, это быстрее и легче проанализировать (снова, удалить echo
):
#!/bin/bash
pactl list short sink-inputs | head -n 1 | awk '{print$1}' | xargs -n 1 -I{} echo pactl set-sink-input-volume "{}" "$1"
Вероятно, существует лучший способ получить точный импульсный аудио идентификатор, который Вы после, но, так как Вы попросили то, как проанализировать его в рамках сценария удара, здесь идет!
То, что Вы запрашиваете, должно выполнить другую команду удара и получить вывод, как это:
sinkid=$(pactl list sink-inputs | egrep "Sink Input #" | egrep -o [0-9]+)
Разломанный на части:
sinkid
переменная, которую мы создаем (обратите внимание, что Bash является языком, который не терпит пробелы между x=y
в переменных присвоениях)=
говорит удару, что мы присваиваемся, это - значение к чему-то$( ... )
средства мы выполняем команду. Можно видеть, что другие используют символ могилы/обратной галочки, но некоторые (самостоятельно включенный) утверждают, что это более ясно.pactl list sink-inputs
существующая команда, которую Вы выполняете.|
говорит, что мы "передаем вывод по каналу" этого в другую командуgrep "Sink Input #"
находит строку, которой мы интересуемся|
снова передает вывод по каналу, таким образом, мы можем далее обработать его с помощью другой команды grep.egrep -o [0-9]+
находит только число от строки "Sink Input #123
вывод 123
только.Теперь можно занять место в исходной команде sinkid
как это:
pactl set-sink-input-volume "$sinkid" "$level"