Como fazer um som depois que um processo é concluído?

72

Eu iniciei um longo processo por meio de um terminal. É possível fazer o terminal do Ubuntu fazer um som quando o processo estiver concluído? Dessa forma, não preciso continuar verificando, mas será notificado por meio de um som.

    
por Goaler444 02.04.2013 / 20:16

8 respostas

66

Existem pelo menos três formas de linha de comando para realizar isso, colocando o comando suiting no final do seu script que você pode invocar para o seu processo demorado:

  1. A maneira "clássica" de tocar um som é usar beep através dos 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 do /etc/modprobe/blacklist.conf e carregar o módulo do kernel pcspkr .

    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 aplay (instalado por padrão):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Outra maneira é usar a interface de linha de comando pulseaudio para permitir a reprodução de qualquer arquivo de som que seu sistema (em 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 de /usr/share/sounds/ ou qualquer outro arquivo de som que possamos ter em um local diferente.

Apenas para mencioná-lo, existe outra maneira legal de fazer isso usando indevidamente o espeak , que é instalado por padrão no Ubuntu & lt; = 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 & gt; = 12.10, o Orca usa o speak-dispatcher. Nós podemos então instalar o espeak ou, como alternativa, use spd-say "Text" .

    
por Takkat 02.04.2013 / 20:40
56

eu uso

make; spd-say done

Substitua "make" pelo comando de longa duração que você usa.

    
por Memetic 20.02.2015 / 00:58
11

De acordo com isto , o caractere \a escapa ao código ASCII 7, que é o bipe do computador.

Então o echo $'\a' trabalha para fazer um sinal sonoro na minha máquina local, mesmo quando ele é executado em um shell bash rodando em um computador que eu estou conectado através de uma interface de terminal como o PuTTY.

    
por Michael Currie 13.09.2015 / 21:39
11

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.

    
por rsp 01.04.2015 / 21:24
6

Expandindo a resposta de Michael Curries, você pode fazer com que Bash imprima um caractere BEL ( \a ) por meio de PROMPT_COMMAND :

PROMPT_COMMAND='printf \a'

Configurar PROMPT_COMMAND assim fará o Bash executar printf \a no final de cada comando, o que fará com que o terminal reproduza um som (embora, como afirma Muru, simplesmente ativar o redesenho do prompt fará com que o terminal funcione o som, ou seja, o som será tocado toda vez que um novo prompt for desenhado, por exemplo, mesmo quando você pressionar ENTER ).

Este é um recurso de terminal, portanto, pode não funcionar em todos os terminais; por exemplo, ele não funciona no console (mas tenho certeza que funciona em gnome-terminal e xterm ).

    
por kos 06.03.2016 / 21:25
2

O comando

 speaker-test

faz um som de ruído. Solução mais simples, mas irritante. : -)

Veja o manual de speaker-test(1) para opções de configuração do sinal de ruído.

    
por xerostomus 01.11.2015 / 09:01
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 finalizada.

Exemplo 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error) resultará em uma palavra de erro.

* Precisa de gnustep-gui-runtime -

sudo apt-get install gnustep-gui-runtime

Felicidades.

    
por AlikElzin-kilaka 23.05.2016 / 13:23
1

Isso não é o que você pediu, mas você pode usar uma notificação para isso.

Substitua o comando fornecido nas outras respostas com

notify-send "Process terminated" "Come back to the terminal, the task is over"
    
por solsTiCe 30.03.2018 / 16:07