TL; DR
Para reproduzir um som após o término do comando:
long-running-command; sn3
(onde sn3
é o som número 3) coloque isso em .bashrc
:
sound() {
# plays sounds in sequence and waits for them to finish
for s in $@; do
paplay $s
done
}
sn1() {
sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}
Ou leia abaixo para mais opções:
Som diferente sobre erro e sucesso
Aqui está o que eu uso exatamente o que você pede - com uma diferença: ele não apenas reproduz um som quando o comando termina, mas reproduz um som diferente no sucesso e no erro. (Mas você pode mudar isso se você não gostar disso.)
Eu tenho uma função Bash chamada oks
que eu uso no final dos comandos de longa execução:
make && make test && make install; oks
Reproduz um som e exibe OK ou ERRO (com código de erro) quando o comando anterior termina.
Código-fonte
Aqui está essa função com dois ajudantes:
sound() {
# plays sounds in sequence and waits for them to finish
for s in $@; do
paplay $s
done
}
soundbg() {
# plays all sounds at the same time in the background
for s in $@; do
# you may need to change 0 to 1 or something else:
pacmd play-file $s 0 >/dev/null
done
}
oks() {
# like ok but with sounds
s=$?
sound_ok=/usr/share/sounds/ubuntu/stereo/dialog-information.ogg
sound_error=/usr/share/sounds/ubuntu/stereo/dialog-warning.ogg
if [[ $s = 0 ]]; then
echo OK
soundbg $sound_ok
else
echo ERROR: $s
soundbg $sound_error
fi
}
Instalação
Você pode colocá-lo em seu ~ / .bashrc diretamente ou colocá-lo em algum outro arquivo e depois colocar esta linha em seu ~ / .bashrc:
. ~/path/to/file/with/function
Configuração
Altere sound_ok
e sound_error
para alguns outros sons.
Você pode experimentar com sound
vs. soundbg
e alterar sound_ok
e sound_error
para usar seqüências de muitos sons que você gostaria de obter o resultado desejado.
Bons sons
Para encontrar bons sons no seu sistema, você pode tentar:
for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done
Aqui estão alguns sons que eu uso freqüentemente disponíveis no Ubuntu por padrão que são bons para notificações - sn1 é alto e legal, sn2 é muito alto e ainda é muito legal, sn3 é extremamente alto e não é tão legal:
sn1() {
sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}
Mais uma vez, você pode alterar sound
para soundbg
se quiser reproduzi-lo em segundo plano sem esperar que o som seja concluído (por exemplo, para não deixar seus scripts mais lentos quando você toca muitos sons).
Versão silenciosa
E apenas no caso - aqui está a mesma função que oks
, mas sem sons:
ok() {
# prints OK or ERROR and exit status of previous command
s=$?
if [[ $s = 0 ]]; then
echo OK
else
echo ERROR: $s
fi
}
Uso
Veja como você o usa:
Exemplo com sucesso:
ls / && ls /bin && ls /usr; oks
exemplo com erro:
ls / && ls /bim && ls /usr; oks
Claro que na prática os comandos são mais parecidos com:
make && make test && make install; oks
mas usei ls
para que você possa ver rapidamente como funciona.
Você pode usar ok
em vez de oks
para uma versão silenciosa.
Ou você pode usar, por exemplo:
ls / && ls /bim && ls /usr; ok; sn1
para imprimir OK / ERROR, mas sempre reproduz o mesmo som, etc.
Atualizar
Eu coloquei essas funções no GitHub, veja:
A origem pode ser baixada em:
Atualização 2
Eu adicionei uma função soundloop
ao repositório acima. Ele toca um som e pode ser interrompido por Ctrl + C (ao contrário de um simples while true; do paplay file.ogg; done
que se espera que funcione, mas não funciona), como solicitado por shadi nos comentários. Ele é implementado como:
soundloop() {
set +m
a='date +%s'
{ paplay & } 2>/dev/null
wait
b='date +%s'
d=$(($b-$a))
[ $d -eq 0 ] && d=1
while :; do
pacmd play-file 0 >/dev/null
sleep $d
done
}
Se você acha que isso é complicado, direcione suas reclamações para os desenvolvedores do PulseAudio.