Wie mache ich einen Sound, wenn ein Prozess abgeschlossen ist?

94

Ich habe einen langen Prozess durch ein Terminal gestartet. Ist es möglich, dass das Ubuntu-Terminal nach Abschluss des Vorgangs einen Ton ausgibt? Auf diese Weise muss ich nicht weiter nachsehen, sondern werde durch einen Ton benachrichtigt.

Goaler444
quelle
Können Sie weiter erklären, was Sie mit abgeschlossenem Prozess meinen ?
Lucio
1
@ Lucio Kontrolle wird zurück zum Terminal
Goaler444
1
Meinen Sie, öffnen Sie eine Anwendung vom Terminal aus und geben Sie nach Beendigung einen Ton aus? Besitzen Sie einen Ubuntu-Server oder meinen Sie GUI-Software?
Lucio
2
ja genau. Zum Beispiel starte ich ein Kommandozeilenprogramm und sobald es beendet ist und die Steuerung wieder zum Terminal zurückgekehrt ist, wird ein Ton ausgegeben. Ich benutze derzeit Ubuntu 12.10
Goaler444

Antworten:

78

Es gibt mindestens drei Befehlszeilenmethoden, um dies zu erreichen, indem Sie den entsprechenden Befehl an das Ende Ihres Skripts setzen, das Sie möglicherweise für Ihren langen Prozess aufrufen:

  1. Die "klassische" Art, einen Sound abzuspielen, besteht darin, durch die PC-Lautsprecher zu piepen Piepton einschalten . Dies funktioniert jedoch nicht in allen Fällen (z. B. bei meinem System sind die PC-Lautsprecher vollständig deaktiviert), und Sie müssen pscpkr entfernen /etc/modprobe/blacklist.confund das pcspkrKernelmodul laden .

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Wir können auch jede Audiodatei im WAV-Format mit aplay abspielen (standardmäßig installiert):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Eine andere Möglichkeit besteht darin, die Befehlszeilenschnittstelle von pulseaudio zu verwenden, um die Wiedergabe von Audiodateien zu ermöglichen, die Ihr System (in libsndfile) bei der Standardaudioausgabe erkennt:

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

    Wir können Standard-Audiodateien von /usr/share/sounds/oder jede andere Audiodatei verwenden , die sich an einem anderen Ort befindet.


Um es nur zu erwähnen, es gibt einen anderen netten Weg, dies durch Missbrauch von espeak zu erreichen , das standardmäßig in Ubuntu <= 12.04 installiert ist. Sehen oder hören Sie das folgende Beispiel:

#! /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 verwendet Orca den Speak-Dispatcher. Wir können dann espeak installieren Installieren Sie espeakoder alternativ verwenden spd-say "Text".

Takkat
quelle
1
@Takkat Ich verwende Ubuntu 12.10 und espeak ist momentan nicht installiert.
Lucio
@Lucio: Ja, jetzt wo du es sagst ... Sie wechselten zum Sprechen-Dispatcher. Wenn dies funktioniert (es funktioniert nicht auf meinem System), siehe Bearbeiten für die Verwendung spd-say.
Takkat
@Takkat Das spd-sayDienstprogramm ist standardmäßig installiert und funktioniert auf meinem System.
Lucio
Werfen Sie
1
Ich hatte guten Erfolg mitpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza
73

ich benutze

make; spd-say done

Ersetzen Sie "make" durch einen beliebigen Befehl mit langer Laufzeit.

Memetic
quelle
Du hast gerade meinen Tag gemacht !! : D
n0noob
5
spd-say 'get back to work'. Und es ist auch vorinstalliert: releases.ubuntu.com/trusty/… , für Blinde, nehme ich an? Und -wfür Endlosschleifen: while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli
Ich habe viel härter gelacht, als ich sollte.
NelsonGon
15

TL; DR

So spielen Sie nach Beendigung des Befehls einen Sound ab:

long-running-command; sn3

(wo sn3ist Ton Nummer 3) setzen Sie dies 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
}

Oder lesen Sie unten für weitere Optionen:

Unterschiedlicher Klang bei Irrtum und Erfolg

Hier ist, was ich für genau das verwende, wonach Sie fragen - mit einem Unterschied: Es wird nicht nur ein Ton abgespielt, wenn der Befehl beendet ist, sondern es wird bei Erfolg und bei Fehlern ein anderer Ton abgespielt. (Aber Sie können es ändern, wenn Sie es nicht mögen.)

Ich habe eine Bash-Funktion oks, die ich am Ende lang laufender Befehle benutze:

make && make test && make install; oks

Es wird ein Ton abgespielt und nach Beendigung des vorherigen Befehls OK oder ERROR (mit Fehlercode) angezeigt.

Quellcode

Hier ist diese Funktion mit zwei Helfern:

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
}

Installation

Sie können es direkt in Ihre ~ / .bashrc oder in eine andere Datei einfügen und dann diese Zeile in Ihre ~ / .bashrc einfügen:

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

Aufbau

Ändern Sie sound_okund sound_errorzu einigen anderen Tönen.

Sie können mit experimentieren soundvs. soundbgund Veränderung sound_okund sound_errorSequenzen von vielen Sounds zu verwenden , die das Ergebnis bekommen , die Sie wollen.

Gute Klänge

Um ein paar gute Sounds auf Ihrem System zu finden, können Sie versuchen:

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

Hier sind einige Sounds, die ich oft benutze und die standardmäßig auf Ubuntu verfügbar sind und die für Benachrichtigungen gut sind - sn1 ist laut und nett, sn2 ist sehr laut und immer noch ziemlich nett, sn3 ist extrem laut und nicht so nett:

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
}

Auch hier können Sie zu wechseln sound, soundbgwenn Sie es im Hintergrund abspielen möchten, ohne darauf zu warten, dass der Sound beendet wird (z. B. um Ihre Skripte nicht zu verlangsamen, wenn Sie viele Sounds abspielen).

Stille Version

Und nur für den Fall - hier ist die gleiche Funktion wie oksaber ohne Töne:

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

Verwendungszweck

So verwenden Sie es:

Beispiel mit Erfolg:

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

Beispiel mit Fehler:

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

In der Praxis sehen die Befehle natürlich eher so aus:

make && make test && make install; oks

aber ich habe lsso schnell gesehen wie es funktioniert.

Sie können okstatt oksfür eine stille Version verwenden.

Oder Sie können zB verwenden:

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

um OK / ERROR zu drucken, aber immer den gleichen Sound abzuspielen usw.

Aktualisieren

Ich habe diese Funktionen auf GitHub gestellt, siehe:

Die Quelle kann heruntergeladen werden von:

Update 2

Ich soundloophabe dem obigen Repo eine Funktion hinzugefügt . Es gibt einen Sound wieder und kann durch Strg + C unterbrochen werden (im Gegensatz zu einem einfachen while true; do paplay file.ogg; done, von dem man erwarten würde, dass er funktioniert, aber nicht), wie in den Kommentaren von shadi gefordert . Es ist implementiert 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
}

Wenn Sie der Meinung sind, dass es kompliziert ist, richten Sie Ihre Beschwerden bitte an die Entwickler von PulseAudio.

rsp
quelle
Ich habe versucht, dies while true; do paplay ...; doneso einzustellen, dass sich der Ton wiederholt, bis ich ihn drücke Ctrl+C, aber wenn ich das tue, bricht er nicht. Ich kann keine speziellen Optionen finden, man paplayum herauszufinden, wie dies funktioniert. Irgendwelche Ideen?
Shadi
@shadi In meiner aktualisierten Antwort finden Sie eine Lösung mit einem Sound, der wiederholt wird, bis Sie Strg + C drücken.
Antwort
14

Nach dieser das \aZeichen entkommt ASCII - Code 7, die den Ton des Computers ist.

So echo $'\a'funktioniert einen Piepton auf meinem lokalen Rechner zu machen, auch wenn es auf einer Bash - Shell läuft auf einem Computer verbunden Ich bin zu über eine Terminal - Schnittstelle wie PuTTY ausgeführt wird .

Michael Currie
quelle
3
tolle! Dies ist die einfachste und beste Lösung (zumindest für mich), da keine Anwendungen von Drittanbietern installiert werden müssen. Sie können sogar mitten im Prozess eingegeben / eingefügt werden, um ausgeführt zu werden, nachdem die Eingabeaufforderung den Fokus erhält.
HLOPETZ
2
Der Sound dieses Charakters ist in den meisten modernen Terminals standardmäßig
deaktiviert
6

Erweitern Sie die Antwort von Michael Curries und lassen Sie Bash ein BEL( \a) -Zeichen drucken durch PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

Wenn Sie dies PROMPT_COMMANDso einstellen, wird Bash printf \\aam Ende jedes Befehls ausgeführt, wodurch das Terminal einen Ton wiedergibt (obwohl das Terminal, wie Muru betont, durch einfaches Auslösen des Neuzeichnens der Eingabeaufforderung den Ton wiedergibt, dh der Ton wird wiedergegeben jedes Mal, wenn eine neue Eingabeaufforderung ausgegeben wird (z. B. auch wenn nur ein Treffer erfolgt ENTER).

Dies ist eine Terminalfunktion, die möglicherweise nicht für alle Terminals funktioniert. Zum Beispiel funktioniert es nicht in der Konsole (aber ich bin sicher, es funktioniert in gnome-terminalund xterm).

kos
quelle
5
(mit der Einschränkung, dass jedes Mal, wenn Sie die Eingabetaste drücken, ein Ton
ausgegeben wird
2

Dies ist nicht das, was Sie gefragt haben, aber Sie könnten eine Benachrichtigung dafür verwenden.

Ersetzen Sie den Befehl in den anderen Antworten durch

notify-send "Process terminated" "Come back to the terminal, the task is over"
Sonnenwende
quelle
1
command && (say done ; echo done) || (echo error ; say error)

Beispiel 1: echo alik && (say done ; echo done) || (echo error ; say error)ergibt ein erledigtes Wort.

Beispiel 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)führt zu einem Fehlerwort.

* Bedürfnisse gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Prost.

AlikElzin-kilaka
quelle
0

Ich habe ein einfaches und fast natives Skript erstellt, das Sound wiedergibt und eine Benachrichtigung mit einer bestimmten Nachricht und Uhrzeit für Ubuntu ( Gist ) anzeigt :

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

Wie benutzt man?

Erster Lauf - Einrichten:

  1. Erstellen Sie ein neues Verzeichnis bei Ihnen zu Hause und rufen Sie es an noti

    mkdir ~/noti
    
  2. Laden Sie noti.sh herunter und extrahieren Sie es in das oben angegebene Verzeichnisnoti .

  3. Öffnen Sie das Terminal und wechseln Sie in das Verzeichnis noti

    cd ~/noti
    
  4. Machen Sie noti.sh ausführbar, indem Sie Folgendes ausführen:

    sudo chmod +x noti.sh
    
  5. Führen Sie einen Test wie folgt aus:

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

Beispiele

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"

Zum Benachrichtigen über das Ende des Prozesses (Beispiel)

sudo apt-get update; noti "Done" "now"
Yahya
quelle
0

ffmpeg Sinuswelle

Für die Minimalisten da draußen können Sie 5 Sekunden lang einen 1000-Hz-Sinus spielen:

sudo apt-get install ffmpeg
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp

oder für immer, bis Sie Strg-C tun:

ffplay -f lavfi -i "sine=frequency=1000" -nodisp

Weitere Informationen finden Sie unter: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Getestet in Ubuntu 18.04, ffmpeg 3.4.6.

Ciro Santilli ist ein Schauspieler
quelle