Eu iniciei um longo processo através de um terminal. É possível fazer o terminal Ubuntu emitir um som depois que o processo estiver concluído? Dessa forma, não preciso continuar verificando, mas serei notificado através de um som.
Eu iniciei um longo processo através de um terminal. É possível fazer o terminal Ubuntu emitir um som depois que o processo estiver concluído? Dessa forma, não preciso continuar verificando, mas serei notificado através de um som.
Respostas:
Há pelo menos três formas de linha de comando para fazer isso, colocando o comando de adequação no final do seu script, que você pode invocar para o longo processo:
A maneira "clássica" de tocar um som é usar o sinal sonoro nos alto-falantes do PC. No entanto, isso não funcionará em todos os casos (por exemplo, no meu sistema, os alto-falantes do PC estão completamente desativados) e você precisará remover o pscpkr /etc/modprobe/blacklist.conf
e carregar o pcspkr
módulo do kernel.
sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
sudo modprobe pcspkr
beep [optional parameters]
Também podemos reproduzir qualquer arquivo de som no formato wav usando o aplay (instalado por padrão):
aplay /usr/share/sounds/alsa/Side_Right.wav
Outra maneira é usar a interface da linha de comandos pulseaudio para permitir a reprodução de qualquer arquivo de som que o seu sistema (in libsndfile
) reconheça na saída de áudio padrão:
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
Podemos usar arquivos de som padrão /usr/share/sounds/
ou qualquer outro arquivo de som que possamos ter em um local diferente.
Só para mencionar, há outra maneira agradável de fazer isso usando o espeak , que é instalado por padrão no Ubuntu <= 12.04. Veja, ou melhor, ouça o seguinte exemplo:
#! /bin/bash
c=10; while [ $c -ge 0 ]; do espeak $c; let c--; done; sleep 1 ## here lengthy code
espeak "We are done with counting"
No Ubuntu> = 12.10, o Orca usa o speak-dispatcher. Podemos instalar o espeak ou, alternativamente, usar spd-say "Text"
.
spd-say
.
spd-say
utilitário está instalado por padrão e funciona no meu sistema.
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
eu uso
make; spd-say done
Substitua "make" por qualquer comando de longa duração que você usar.
spd-say 'get back to work
' E vem pré-instalado também: releases.ubuntu.com/trusty/… , para pessoas cegas, suponho? E -w
para loops infinitos: while true; do spd-say -w 'get back to work you lazy bum'; done
.
Para reproduzir um som após a conclusão do comando:
long-running-command; sn3
(onde sn3
está 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:
Aqui está o que eu uso exatamente para o que você solicita - com uma diferença: ele não apenas reproduz um som quando o comando termina, mas reproduz um som diferente em caso de sucesso e erro. (Mas você pode alterá-lo se não gostar.)
Eu tenho uma função Bash chamada oks
que eu uso no final de comandos de longa execução:
make && make test && make install; oks
Toca um som e exibe OK ou ERROR (com código de erro) quando o comando anterior termina.
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
}
Você pode colocá-lo em seu ~ / .bashrc diretamente ou em algum outro arquivo e, em seguida, colocar esta linha em seu ~ / .bashrc:
. ~/path/to/file/with/function
Mude sound_ok
e sound_error
para outros sons.
Você pode experimentar sound
vs. soundbg
e alterar sound_ok
e sound_error
usar seqüências de muitos sons que você gosta para obter o resultado desejado.
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 costumo usar, disponíveis por padrão no Ubuntu, que são bons para notificações - sn1 é alto e agradável, sn2 é muito alto e ainda é bastante agradável, 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
}
Novamente, você pode mudar sound
para soundbg
se quiser reproduzi-lo em segundo plano sem esperar o som terminar (por exemplo, para não diminuir a velocidade dos seus scripts quando você reproduz muitos sons).
E apenas no caso - aqui está a mesma função, 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
}
Aqui está como você o usa:
Exemplo com sucesso:
ls / && ls /bin && ls /usr; oks
exemplo com erro:
ls / && ls /bim && ls /usr; oks
Obviamente, na prática, os comandos são mais parecidos com:
make && make test && make install; oks
mas eu usei ls
para que você pudesse ver rapidamente como funciona.
Você pode usar em ok
vez de oks
para uma versão silenciosa.
Ou você pode usar, por exemplo:
ls / && ls /bim && ls /usr; ok; sn1
para imprimir OK / ERRO, mas sempre toque o mesmo som, etc.
Eu coloquei essas funções no GitHub, veja:
A fonte pode ser baixada em:
Eu adicionei uma soundloop
função ao repositório acima. Toca um som e pode ser interrompido por Ctrl + C (diferente de um simples while true; do paplay file.ogg; done
que se esperaria que funcionasse, mas não funciona), conforme solicitado por shadi nos comentários. É implementado como:
soundloop() {
set +m
a=`date +%s`
{ paplay $1 & } 2>/dev/null
wait
b=`date +%s`
d=$(($b-$a))
[ $d -eq 0 ] && d=1
while :; do
pacmd play-file $1 0 >/dev/null
sleep $d
done
}
Se você acha que é complicado, encaminhe suas queixas aos desenvolvedores do PulseAudio.
while true; do paplay ...; done
para que o som se repita até que eu bato Ctrl+C
, mas quando o faço, ele não quebra. Não consigo encontrar nenhuma opção especial man paplay
para descobrir como fazer isso funcionar. Alguma ideia?
De acordo com isso, o \a
caractere escapa ao código ASCII 7, que é o bipe do computador.
Então, echo $'\a'
funciona para emitir um sinal sonoro na minha máquina local, mesmo quando executado em um shell bash executando em um computador ao qual estou conectado através de uma interface de terminal como o PuTTY.
Ao expandir a resposta de Michael Curries, você pode fazer com que o Bash imprima um caractere BEL
( \a
) através de PROMPT_COMMAND
:
PROMPT_COMMAND='printf \\a'
Definir PROMPT_COMMAND
essa maneira fará com que o Bash seja executado printf \\a
no final de cada comando, o que fará o terminal tocar um som (embora, como aponta muru, o simples acionamento do redesenho do prompt faça o terminal tocar o som, ou seja, o som será reproduzido. cada vez que um novo prompt é desenhado, por exemplo, mesmo quando apenas pressionando ENTER).
Esse é um recurso do terminal, portanto pode não funcionar em todos os terminais; por exemplo, ele não funciona no console (mas tenho certeza de que funciona no gnome-terminal
e xterm
).
O comando
speaker-test
emite um ruído. Solução mais simples, mas irritante. :-)
Veja o manual despeaker-test(1)
opções para configurar o sinal de ruído.
command && (say done ; echo done) || (echo error ; say error)
Exemplo 1: echo alik && (say done ; echo done) || (echo error ; say error)
resultará em uma palavra pronta.
Exemplo 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)
resultará em uma palavra de erro.
* Necessidades gnustep-gui-runtime
-
sudo apt-get install gnustep-gui-runtime
Felicidades.
Criei um script simples e quase nativo que reproduz o som e exibe uma notificação com uma mensagem e um horário para o Ubuntu ( Gist ):
#!/bin/sh
# https://gist.github.com/John-Almardeny/04fb95eeb969aa46f031457c7815b07d
# Create a Notification With Sound with a Given Message and Time
# The Downloaded Sound is from Notification Sounds https://notificationsounds.com/
MSSG="$1"
TIME="$2"
# install wget if not found
if ! [ -x "$(command -v wget)" ]; then
echo -e "INSTALLING WGET...\n\n"
sudo apt-get install wget
echo -e "\n\n"
fi
# install at package if not found
if ! [ -x "$(command -v at)" ]; then
echo -e "INSTALLING AT...\n\n"
sudo apt-get install at
echo -e "\n\n"
fi
# install sox if not found
if ! [ -x "$(command -v sox)" ]; then
echo -e "INSTALLING SOX...\n\n"
sudo apt-get install sox
sudo apt-get install sox libsox-fmt-all
echo -e "\n\n"
fi
# download the noti sound if this is first time
# add alias to the bashrc file
if ! [ -f ~/noti/sound.mp3 ]; then
echo -e "DOWNLOADING SOUND...\n\n"
touch ~/noti/sound.mp3 | wget -O ~/noti/sound.mp3 "https://notificationsounds.com/wake-up-tones/rise-and-shine-342/download/mp3"
sudo echo "alias noti=\"sh ~/noti/noti.sh\"" >> ~/.bashrc
source ~/.bashrc
echo -e "\n\n"
fi
# notify with the sound playing and particular given message and time
echo "notify-send \""$MSSG\"" && play ~/noti/sound.mp3" | at $TIME
Crie um novo diretório em sua casa e chame-o noti
mkdir ~/noti
Faça o download do noti.sh e extraia-o para o noti
diretório acima .
Abra Terminal e altere o diretório para noti
cd ~/noti
Torne o noti.sh executável emitindo:
sudo chmod +x noti.sh
Execute um teste como este:
sh ~/noti/noti.sh "Test" "now"
noti "Hello From Noti" "now +1 minute"
noti "Hello From Noti" "now +5 minutes"
noti "Hello From Noti" "now + 1 hour"
noti "Hello From Noti" "now + 2 days"
noti "Hello From Noti" "4 PM + 2 days"
noti "Hello From Noti" "now + 3 weeks"
noti "Hello From Noti" "now + 4 months"
noti "Hello From Noti" "4:00 PM"
noti "Hello From Noti" "2:30 AM tomorrow"
noti "Hello From Noti" "2:30 PM Fri"
noti "Hello From Noti" "2:30 PM 25.07.18"
sudo apt-get update; noti "Done" "now"
onda senoidal ffmpeg
Para os minimalistas, você pode tocar um seno de 1000 Hz por 5 segundos:
sudo apt-get install ffmpeg
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp
ou para sempre até você pressionar Ctrl-C:
ffplay -f lavfi -i "sine=frequency=1000" -nodisp
Mais informações em: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684
Testado no Ubuntu 18.04, ffmpeg 3.4.6.