por que os xargs não estão analisando minha entrada corretamente?

2

Eu tenho tentado escrever um script de shell que fará interface com o cmus e, em seguida, notificar-me sobre as informações da faixa usando o comando notify-send. No momento não está funcionando, principalmente porque o xargs não parece passar 2 argumentos para notificar-enviar. Só envia um e não consigo descobrir o porquê. Eu fiz tudo o que posso pensar com sed para obter o resultado certo, mas não funciona. Além disso, se eu usar notificar-enviar com dois argumentos, ele funciona, então não acho que seja um problema com o envio de notificação.

A saída do cmus-remote -Q é:

status paused
file /home/dennis/music/Coheed And Cambria/GOODAP~1/05 Crossing the Frame.mp3
duration 207
position 120
tag artist Coheed & Cambria
tag album Good Apollo I'm Burning Star IV Volume One: From Fear Through the Eyes of Madness
tag title Crossing the Frame
tag date 2005
tag genre Rock
tag tracknumber 5
tag albumartist Coheed & Cambria
set aaa_mode all
set continue true
set play_library true
set play_sorted false
set replaygain disabled
set replaygain_limit true
set replaygain_preamp 6.000000
set repeat false
set repeat_current false
set shuffle true
set softvol false
set vol_left 100
set vol_right 100

Meu código é terrível. Estou apenas começando a aprender scripts de shell, então sinto muito por isso.

#!/bin/sh
#
# notify of song playing

info="$(cmus-remote -Q)"

title="'echo "$info" | grep 'tag title' | sed "s/'//g" | sed 's/tag title \(.*\)/'\'''\''/g''"

artist="'echo "$info" | grep 'tag artist' | sed "s/'//g" | sed 's/tag artist \(.*\)/ '\''/g''"
album="'echo "$info" | grep 'tag album ' | sed "s/'//g" | sed 's/tag album \(.*\)/ '\''/g''"

stupid="${title}${artist}$album"
echo "$stupid" | xargs notify-send
    
por Dennis Hodapp 18.06.2011 / 04:22

1 resposta

4

xargs está funcionando conforme pretendido; cada linha é tomada como um parâmetro. Se você quiser vários parâmetros, separe-os com novas linhas.

{echo "$title"; echo "$artist"; echo "$album"} | xargs notify-send

Dito isto, você está fazendo muito trabalho para algo bem simples:

title="$(echo "$info" | sed -n 's/^tag title //p')"
artist="$(echo "$info" | sed -n 's/^tag artist //p')"
album="$(echo "$info" | sed -n 's/^tag album //p')"
notify-send "$title" "$artist" "$album"

(Observe também uma outra pegadinha: notify-osd envia as mensagens passadas pelo Pango, então você precisa escapar de qualquer coisa que possa ser confundida com a marcação do Pango. Isso significa < , > e & em prática, assim como com HTML e XML. O acima não tenta lidar com isso.)

    
por 18.06.2011 / 04:26