Vraag Hoe maak je een geluid zodra een proces is voltooid?


Ik ben een lang proces gestart via een terminal. Is het mogelijk om de Ubuntu-terminal een geluid te laten maken als het proces is voltooid? Op deze manier hoef ik niet te blijven checken, maar krijg ik een melding via een geluid.


76
2018-04-02 18:16


oorsprong


Kun je verder uitleggen waarmee je bedoelt? proces voltooid? - Lucio
@Lucio-besturing wordt teruggestuurd naar de terminal - Goaler444
Bedoel je, open een applicatie vanaf de terminal en maak een geluid als het klaar is? Heeft u een Ubuntu-server of bedoelt u GUI-software? - Lucio
Ja precies. Ik start bijvoorbeeld een opdrachtregelprogramma en als het eenmaal is afgesloten en de besturing is teruggekeerd naar de terminal, wordt er een geluid gemaakt. Ik gebruik momenteel Ubuntu 12.10 - Goaler444


antwoorden:


Er zijn minstens drie opdrachtregelmanieren om dit te bereiken door het toepasselijke commando aan het einde van je script in te voegen dat je voor je lange proces kunt gebruiken:

  1. De "klassieke" manier om een ​​geluid te spelen is om te gebruiken signaal  Install beep  via de pc-luidsprekers. Dit zal echter niet in alle gevallen werken (bijvoorbeeld in mijn systeem zijn pc-luidsprekers volledig uitgeschakeld) en moet je pscpkr verwijderen van /etc/modprobe/blacklist.conf en laad de pcspkr kernelmodule.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. We kunnen ook elk geluidsbestand in wav-formaat afspelen met behulp van aplay (standaard geïnstalleerd):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Een andere manier is om de pulseaudio-opdrachtregelinterface te gebruiken om alle geluidsbestanden van uw systeem in te schakelen (in libsndfile) herkent op de standaard audio-uitgang:

     paplay /usr/share/sounds/freedesktop/stereo/complete.oga
    

    We kunnen standaard geluidsbestanden gebruiken van /usr/share/sounds/, of elk ander geluidsbestand dat we op een andere locatie hebben.


Om het maar te noemen, er is nog een andere leuke manier om dit te bereiken door misbruik espeak, die standaard is geïnstalleerd in Ubuntu <= 12.04. Zie, of hoor liever het volgende voorbeeld:

#! /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"

In Ubuntu> = 12.10 gebruikt Orca een spreekpijp. We kunnen dan installeren espeak  Install espeak, of gebruik als alternatief spd-say "Text".


69
2018-04-02 18:40



@Takkat Ik gebruik Ubuntu 12.10 en espeakis momenteel niet geïnstalleerd. - Lucio
@Lucio: ja, nu je het zegt ... Ze zijn overgestapt naar spreekverzender. Als dit werkt (dit staat niet op mijn systeem), zie Bewerken voor gebruik spd-say. - Takkat
@Takkat The spd-say hulpprogramma wordt standaard geïnstalleerd en het werkt op mijn systeem. - Lucio
Kijk hier ook eens naar V / A - c0rp
Ik had goed succes met paplay /usr/share/sounds/freedesktop/stereo/complete.oga - Nicholas DiPiazza


ik gebruik

make; spd-say done

Vervang "make" door elke langlopende opdracht die u gebruikt.


60
2018-02-19 23:58



Je hebt mijn dag gemaakt!! : D - n0noob
spd-say 'get back to work'. En komt ook vooraf geïnstalleerd: releases.ubuntu.com/trusty/... , voor blinden denk ik? En -w voor oneindige loops: while true; do spd-say -w 'get back to work you lazy bum'; done. - Ciro Santilli 新疆改造中心 六四事件 法轮功


Volgens deze de \a teken ontsnapt ASCII-code 7, het piepje van de computer.

Zo echo $'\a' werkt om een ​​piepgeluid te maken op mijn lokale computer, zelfs als het wordt uitgevoerd op een bash-shell die wordt uitgevoerd op een computer met wie ik ben verbonden via een terminalinterface zoals PuTTY.


11
2017-09-13 19:39



verbazingwekkend! dat is de gemakkelijkste en beste oplossing (althans voor mij) omdat het geen apps van derden hoeft te installeren en zelfs kan worden getypt / geplakt midden in het proces dat moet worden uitgevoerd nadat de opdrachtprompt de focus krijgt. - hlopetz
het geluid van dit karakter is standaard uitgeschakeld in de meeste moderne terminals - Blauhirn


TL; DR

Om een ​​geluid af te spelen nadat de opdracht is voltooid:

long-running-command; sn3

(waar sn3 is geluid nummer 3) stop dit in .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
}

Of lees hieronder voor meer opties:

Verschillende geluiden over fouten en succes

Hier is wat ik gebruik voor precies wat je vraagt ​​- met één verschil: het speelt niet alleen een geluid wanneer het commando is voltooid, maar het speelt ook een verschillend geluid bij succes en bij fouten. (Maar je kunt het veranderen als je het niet leuk vindt.)

Ik heb een Bash-functie genaamd oks die ik gebruik aan het einde van langlopende opdrachten:

make && make test && make install; oks

Het speelt een geluid af en geeft OK of ERROR (met foutcode) weer als de vorige opdracht is voltooid.

Broncode

Hier is die functie met twee helpers:

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
}

Installatie

Je kunt het direct in je ~ / .bashrc plaatsen of in een ander bestand plaatsen en dan deze regel in je ~ / .bashrc plaatsen:

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

Configuratie

Verandering sound_ok en sound_error voor sommige andere geluiden.

Je kunt ermee experimenteren sound vs. soundbg en veranderen sound_ok en sound_error om reeksen van vele geluiden te gebruiken waarvan u houdt dat u het gewenste resultaat krijgt.

Goede geluiden

Om enkele goede geluiden op uw systeem te vinden, kunt u het volgende proberen:

for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done

Hier zijn enkele geluiden die ik vaak gebruik die standaard beschikbaar zijn op Ubuntu en die goed zijn voor meldingen - sn1 is luid en mooi, sn2 is erg luid en nog steeds best leuk, sn3 is extreem luid en niet zo leuk:

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
}

Nogmaals, je kunt veranderen sound naar soundbg als u het op de achtergrond wilt afspelen zonder te hoeven wachten tot het geluid is afgelopen (bijvoorbeeld om uw scripts niet te vertragen als u veel geluiden speelt).

Stille versie

En voor het geval - hier is dezelfde functie als oks maar zonder geluiden:

ok() {
  # prints OK or ERROR and exit status of previous command
  s=$?
  if [[ $s = 0 ]]; then
    echo OK
  else
    echo ERROR: $s
  fi
}

Gebruik

Hier is hoe je het gebruikt:

Voorbeeld met succes:

ls / && ls /bin && ls /usr; oks

voorbeeld met fout:

ls / && ls /bim && ls /usr; oks

Natuurlijk zijn de opdrachten in de praktijk meer als:

make && make test && make install; oks

maar ik gebruikte ls dus je kon snel zien hoe het werkt.

Je kunt gebruiken ok in plaats van oks voor een stille versie.

Of u kunt bijvoorbeeld:

ls / && ls /bim && ls /usr; ok; sn1

om OK / ERROR af te drukken, maar altijd hetzelfde geluid af te spelen, enz.

Bijwerken

Ik zet die functies op GitHub, zie:

De bron kan worden gedownload van:

Update 2

Ik heb er een toegevoegd soundloop functie naar de bovenstaande repo. Het speelt een geluid en kan worden onderbroken door Ctrl + C (in tegenstelling tot een simpele while true; do paplay file.ogg; done die men zou verwachten te werken, maar dat doet het niet) zoals gevraagd door shadi in de reacties. Het is geïmplementeerd als:

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
}

Als je denkt dat het ingewikkeld is, stuur je klachten dan naar PulseAudio-ontwikkelaars.


11
2018-04-01 19:24



Ik heb geprobeerd dit in een while true; do paplay ...; done zodat het geluid herhaalt totdat ik raak Ctrl+C, maar wanneer ik het doe, breekt het niet. Ik kan geen speciale opties vinden in man paplay om erachter te komen hoe je dit kunt laten werken. Om het even welke ideeën? - shadi
@shadi Zie mijn bijgewerkte antwoord voor een oplossing met een geluid dat zich herhaalt totdat je op Ctrl + C drukt. - rsp


Uitgaand op het antwoord van Michael Curries, zou je Bash-print kunnen maken a BEL (\a) karakter door PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

omgeving PROMPT_COMMAND op die manier zal Bash uitvoeren printf \\a aan het einde van elk commando, waardoor de terminal een geluid laat horen (hoewel muru aangeeft dat het eenvoudig opnieuw triggeren van de prompt is, zal de terminal het geluid laten spelen, dwz het geluid zal elke keer dat een nieuwe prompt wordt getekend worden afgespeeld , bijvoorbeeld zelfs wanneer je gewoon raakt ENTER).

Dit is een terminalfunctie, dus het werkt mogelijk niet voor alle terminals; het werkt bijvoorbeeld niet in de console (maar ik weet zeker dat het werkt gnome-terminalen xterm).


6
2018-03-06 20:25



(met het voorbehoud dat elke keer dat je op Enter drukt, je een geluid krijgt) - muru


Het bevel

 speaker-test

maakt een ruisgeluid. Eenvoudigste maar irritante oplossing. :-)

Kijk naar de handleiding van speaker-test(1) voor opties om het ruissignaal te configureren.


3
2017-11-01 08:01





command && (say done ; echo done) || (echo error ; say error)

Voorbeeld 1: echo alik && (say done ; echo done) || (echo error ; say error) zal resulteren in een klaar woord.

Voorbeeld 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error) zal resulteren in een foutwoord.

* Behoeften gnustep-gui-runtime -

sudo apt-get install gnustep-gui-runtime

Proost.


1
2018-05-23 11:23