Вопрос прекрасно решен с помощью Music Player Daemon/Советы и хитрости -PulseAudio . И MPD с пульсаудио также полезен.
Сайта на самом деле достаточно, но позвольте мне написать, что я сделал. Во-первых, я установил для поля device
в /etc/mpd.conf
значение "alsa"
, но это неправильно. Динамик Bluetooth по умолчанию управляется не alsa
, а pulseaudio
(, по крайней мере, в Linux Mint, и хотя вы можете использовать динамик Bluetooth через alsa
, используя, например,.BlueALSA
). Таким образом, значение поля должно быть "pulse"
. Однако по умолчанию pulseaudio
выполняется в пользовательском пространстве, а mpd
— в системе -. Таким образом, mpd
не может получить доступ к настройкам сеанса pulseaudio
текущего пользователя. Чтобы mpd
увидел настройку,вы можете включить удаленную функциональность pulseaudio
:
sudo cp /etc/pulse/default.pa /etc/pulse/default.pa.bak
sudo vi /etc/pulse/default.pa
и измените строку
#load-module module-native-protocol-tcp
к этому (раскомментируйте и добавьте несколько слов)
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
и перезапустите pulseaudio
, чтобы отразить это изменение.
#Note there is no `sudo` prefix.
#As written above, `pulseaudio` runs in a user session.
pulseaudio --kill
pulseaudio --start
Теперь вы можете получить доступ к pulseaudio
, используя протокол tcp
и через IP-адрес 127.0.0.1
(, обычно этоlocalhost
). Наконец, следует изменить настройку mpd
:
sudo cp /etc/mpd.conf /etc/mpd.conf.bak
sudo vi /etc/mpd.conf
и установите значение поля audio_output
, как показано ниже
audio_output {
type "pulse"
name "arbitrary_name_which_you_like"
server "localhost"
}
и перезапустите mpd
, чтобы изменения вступили в силу.
#Note there is `sudo` prefix.
sudo systemctl restart mpd
Вот и все.
Дополнение:
Кстати, тот факт, что aplay -D default jingle.wav
удалось, а mpc play
нет, происходит из-за разницы в рабочем пространстве, т.е. запущенной системы -в масштабе или в качестве сеанса пользователя. Так что сравнивать результаты бессмысленно. Я должен был сравнить mpc play
с sudo -u mpd aplay -D default jingle.wav
. Последняя команда завершается ошибкой, и это ожидаемый результат.
если поля данных следуют за строкой заголовка в каждом файле, вы можете сделать:
awk -F, 'FNR==1{ for(i=1; i<=NF; i++) if($i=="ip") break; next }
{ print $1, $i }' log*.csv
Использованиеcsvkit
:
$ csvcut -c hostname,ip log1.csv
hostname,ip
abc,192.168.168.168
def,192.168.168.169
ghi,192.168.168.170
$ csvcut -c hostname,ip log2.csv
hostname,ip
abc,192.168.168.168
def,192.168.168.169
ghi,yyy
Команда csvcut
немного похожа на стандартную команду cut
, но может использовать информацию заголовков для извлечения именованных столбцов.
Обратите внимание, что это зависит от правильности заголовков в каждом файле.
Если у вас есть файлы с заголовками, часто лучше сначала создать сопоставление тегов заголовков (имен )с порядком полей (столбцов ), хранящихся в массиве f[]
ниже, а затем можно просто получить значения поля, разыменовав массив, индексированный по имени поля. Таким образом, ваш скрипт будет работать независимо от порядка столбцов в каждом входном файле :
$ cat tst.awk
BEGIN { FS="," }
FNR==1 {
delete f
for (i=1; i<=NF; i++) {
f[$i] = i
}
next
}
$(f["hostname"]) == h { print $(f["hostname"]), $(f["ip"]) }
$ awk -v h='def' -f tst.awk log*.csv
def 192.168.168.169
def 192.168.168.169