Como emitir um som após a conclusão do processo?


94

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.


Você pode explicar melhor o que você quer dizer com o processo completo ?
Lucio

1
@Lucio controlo é devolvido para o terminal
Goaler444

1
Você quer dizer, abrir um aplicativo a partir do terminal e, quando terminar, emitir um som? Você tem um servidor Ubuntu ou quer dizer software GUI?
Lucio

2
sim, exatamente. Por exemplo, inicio um programa de linha de comando e, quando ele sai e o controle é retornado ao terminal, um som é emitido. Atualmente, estou usando o Ubuntu 12.10
Goaler444

Respostas:


78

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:

  1. A maneira "clássica" de tocar um som é usar o sinal sonoro Instalar 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.confe carregar o pcspkrmódulo do kernel.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. 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
    
  3. 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 Instalar falar ou, alternativamente, usar spd-say "Text".


1
@Takkat Estou usando o Ubuntu 12.10 e o espeak não está instalado no momento.
Lucio

@ Lucio: sim, agora que você diz ... Eles mudaram para o despachante de fala. Se isso funcionar (não funciona no meu sistema), consulte editar para usar spd-say.
Takkat

@Takkat O spd-sayutilitário está instalado por padrão e funciona no meu sistema.
Lucio

Veja também Q / A
c0rp

1
Eu tive um bom sucesso compaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza


15

TL; DR

Para reproduzir um som após a conclusão do comando:

long-running-command; sn3

(onde sn3está 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 em caso de erro e sucesso

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 oksque 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.

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 em algum outro arquivo e, em seguida, colocar esta linha em seu ~ / .bashrc:

. ~/path/to/file/with/function

Configuração

Mude sound_oke sound_errorpara outros sons.

Você pode experimentar soundvs. soundbge alterar sound_oke sound_errorusar seqüências de muitos sons que você gosta para 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 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 soundpara soundbgse 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).

Versão silenciosa

E apenas no caso - aqui está a mesma função, oksmas 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

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 lspara que você pudesse ver rapidamente como funciona.

Você pode usar em okvez de okspara 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.

Atualizar

Eu coloquei essas funções no GitHub, veja:

A fonte pode ser baixada em:

Atualização 2

Eu adicionei uma soundloopfunçã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; doneque 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.


Tentei colocar isso em um while true; do paplay ...; donepara 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 paplaypara descobrir como fazer isso funcionar. Alguma ideia?
shadi

@shadi Veja minha resposta atualizada para uma solução com um som que se repete até você pressionar Ctrl + C.
Rsp #

14

De acordo com isso, o \acaractere 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.


3
surpreendente! essa é a solução mais fácil e melhor (pelo menos para mim) porque não requer a instalação de aplicativos de terceiros e pode até ser digitada / colada no meio do processo para ser executada após o prompt de comando ter foco.
Hlopetz

2
o som desse personagem é desativado na maioria dos terminais modernos por padrão
phil294

6

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_COMMANDessa maneira fará com que o Bash seja executado printf \\ano 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-terminale xterm).


5
(com a ressalva de que cada vez que você pressionar Enter, você vai ter um som)
Muru


2

Não foi isso que você pediu, mas você pode usar a notificação para isso.

Substitua o comando fornecido nas outras respostas por

notify-send "Process terminated" "Come back to the terminal, the task is over"

1
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.


0

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

Como usar?

Primeira execução - Configuração:

  1. Crie um novo diretório em sua casa e chame-o noti

    mkdir ~/noti
    
  2. Faça o download do noti.sh e extraia-o para o notidiretório acima .

  3. Abra Terminal e altere o diretório para noti

    cd ~/noti
    
  4. Torne o noti.sh executável emitindo:

    sudo chmod +x noti.sh
    
  5. Execute um teste como este:

    sh ~/noti/noti.sh "Test" "now"
    

Exemplos

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"

Para notificar o término do processo (exemplo)

sudo apt-get update; noti "Done" "now"

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.