Jak wydać dźwięk po zakończeniu procesu?

94

Rozpocząłem długi proces przez terminal. Czy jest możliwe, aby terminal Ubuntu wydał dźwięk po zakończeniu procesu? W ten sposób nie muszę ciągle sprawdzać, ale zamiast tego zostaniemy powiadomieni dźwiękiem.

Goaler444
źródło
Czy możesz wyjaśnić, co masz na myśli mówiąc o zakończeniu procesu ?
Lucio
1
Kontrola @Lucio jest zwracana z powrotem do terminala
Goaler444
1
Masz na myśli, otwórz aplikację z terminala, a kiedy zakończysz, zrób dźwięk? Czy masz serwer Ubuntu lub masz na myśli oprogramowanie GUI?
Lucio,
2
tak, dokładnie. Na przykład uruchamiam program wiersza polecenia, a po jego zakończeniu i zwróceniu kontroli z powrotem do terminala generowany jest dźwięk. Obecnie używam Ubuntu 12.10
Goaler444

Odpowiedzi:

78

Istnieją co najmniej trzy sposoby osiągnięcia tego celu poprzez umieszczenie odpowiedniego polecenia na końcu skryptu, który możesz wywołać w trakcie długiego procesu:

  1. „Klasycznym” sposobem odtwarzania dźwięku jest użycie sygnału dźwiękowego Zainstaluj sygnał dźwiękowy przez głośniki komputera. Jednak to nie zadziała we wszystkich przypadkach (np. W moim systemie głośniki komputera są całkowicie wyłączone) i będziesz musiał usunąć pscpkr /etc/modprobe/blacklist.confi załadować pcspkrmoduł jądra.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Możemy również odtwarzać dowolny plik dźwiękowy w formacie wav przy użyciu aplay (domyślnie instalowany):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Innym sposobem jest użycie interfejsu wiersza poleceń pulseaudio, aby umożliwić odtwarzanie plików dźwiękowych, które system libsndfilerozpoznaje na domyślnym wyjściu audio:

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

    Możemy użyć domyślnych plików dźwiękowych z /usr/share/sounds/dowolnego innego pliku dźwiękowego w innym miejscu.


Po prostu wspomniałem o tym, istnieje inny fajny sposób na osiągnięcie tego przez niewłaściwe użycie espeak , który jest domyślnie instalowany w Ubuntu <= 12.04. Zobacz, a raczej usłysz następujący przykład:

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

W Ubuntu> = 12.10 Orca używa narzędzia do wysyłania mowy. Następnie możemy zainstalować espeak Zainstaluj espeak lub alternatywnie użyć spd-say "Text".

Takkat
źródło
1
@Takkat Używam Ubuntu 12.10 i espeak nie jest obecnie zainstalowany.
Lucio,
@Lucio: tak, teraz, kiedy to powiedziałeś ... Przeszli na dyspozytora. Jeśli to działa (nie działa w moim systemie), zobacz edycję dotyczącą używania spd-say.
Takkat
@Takkat spd-sayNarzędzie jest instalowane domyślnie i działa w moim systemie.
Lucio
Zobacz także Q / A
c0rp
1
Miałem dobry sukces zpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza
73

używam

make; spd-say done

Zamień „make” na dowolne długotrwałe polecenie, którego używasz.

Memetyczny
źródło
Właśnie sprawiłeś, że mój dzień stał się lepszy!! : D
n0noob
5
spd-say 'get back to work„. I jest również wstępnie zainstalowany: releases.ubuntu.com/trusty/... , dla niewidomych, jak sądzę? I -wdla nieskończonej pętli: while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli 28 改造 中心 法轮功 六四 事件 28.07.16
Śmiałem się o wiele mocniej niż powinienem.
NelsonGon
15

TL; DR

Aby odtworzyć dźwięk po zakończeniu polecenia:

long-running-command; sn3

(gdzie sn3jest dźwięk numer 3) wstaw to .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
}

Lub przeczytaj poniżej, aby uzyskać więcej opcji:

Inny dźwięk błędu i sukcesu

Oto, czego używam do tego, o co prosisz - z jedną różnicą: nie tylko odtwarza dźwięk po zakończeniu polecenia, ale odtwarza inny dźwięk po sukcesie i błędzie. (Ale możesz to zmienić, jeśli ci się nie podoba.)

Mam wywoływaną funkcję Bash oks, której używam na końcu długo działających poleceń:

make && make test && make install; oks

Odtwarza dźwięk i wyświetla komunikat OK lub ERROR (z kodem błędu) po zakończeniu poprzedniego polecenia.

Kod źródłowy

Oto ta funkcja z dwoma pomocnikami:

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
}

Instalacja

Możesz umieścić go bezpośrednio w ~ / .bashrc lub w innym pliku, a następnie umieścić ten wiersz w ~ / .bashrc:

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

Konfiguracja

Zmień sound_oki sound_errorna inne dźwięki.

Możesz eksperymentować z soundvs. soundbgi zmieniać sound_okoraz sound_errorużywać sekwencji wielu dźwięków, które lubisz, aby uzyskać pożądany efekt.

Dobre dźwięki

Aby znaleźć dobre dźwięki w systemie, możesz spróbować:

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

Oto niektóre dźwięki, których często używam i które są domyślnie dostępne na Ubuntu, które są dobre dla powiadomień - sn1 jest głośny i miły, sn2 jest bardzo głośny i wciąż całkiem miły, sn3 jest bardzo głośny i niezbyt miły:

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
}

Ponownie możesz zmienić soundna, soundbgjeśli chcesz grać w tle, nie czekając na zakończenie dźwięku (np. Aby nie spowalniać skryptów podczas odtwarzania wielu dźwięków).

Wersja cicha

I na wszelki wypadek - oto ta sama funkcja, oksale bez dźwięków:

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

Stosowanie

Oto jak z niego korzystasz:

Przykład z sukcesem:

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

przykład z błędem:

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

Oczywiście w praktyce polecenia są bardziej jak:

make && make test && make install; oks

ale użyłem ls, żebyś mógł szybko zobaczyć, jak to działa.

Możesz użyć okzamiast okswersji cichej.

Lub możesz użyć np .:

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

aby wydrukować OK / ERROR, ale zawsze odtwarzaj ten sam dźwięk itp.

Aktualizacja

Umieszczam te funkcje na GitHub, patrz:

Źródło można pobrać z:

Aktualizacja 2

Dodałem soundloopfunkcję do powyższego repozytorium. Odtwarza dźwięk i może być przerwany przez Ctrl + C (w przeciwieństwie do prostego while true; do paplay file.ogg; done, którego można by oczekiwać, ale nie działa), o co poprosił shadi w komentarzach. Jest realizowany jako:

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
}

Jeśli uważasz, że to skomplikowane, skieruj swoje skargi do programistów PulseAudio.

rsp
źródło
Próbowałem ustawić to while true; do paplay ...; donetak, aby dźwięk się powtarzał, aż uderzyłem Ctrl+C, ale kiedy to zrobię, nie łamie się. Nie mogę znaleźć żadnych specjalnych opcji, man paplayaby dowiedzieć się, jak to zrobić. Jakieś pomysły?
shadi 24.09.16
@shadi Zobacz moją zaktualizowaną odpowiedź na rozwiązanie z dźwiękiem, który powtarza się, dopóki nie naciśniesz Ctrl + C.
rsp
14

Według tego\a postać ucieka kod ASCII 7, który jest sygnał komputera.

Tak echo $'\a'działa, aby wydać dźwięk dźwiękowy na moim komputerze lokalnym, nawet jeśli jest on wykonywany w powłoce bash działającej na komputerze, do którego jestem podłączony za pośrednictwem interfejsu terminala, takiego jak PuTTY.

Michael Currie
źródło
3
niesamowity! jest to najłatwiejsze i najlepsze rozwiązanie (przynajmniej dla mnie), ponieważ nie wymaga instalowania żadnych aplikacji innych firm, a nawet można je wpisać / wkleić w trakcie procesu, który zostanie uruchomiony po skupieniu się na wierszu polecenia.
hlopetz
2
dźwięk tej postaci jest domyślnie wyłączony w większości nowoczesnych terminali
phil294
6

Rozwijając odpowiedź Michaela Curriesa, możesz sprawić, że Bash wydrukuje znak BEL( \a) poprzez PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

Ustawienie PROMPT_COMMANDtego sposobu spowoduje, że Bash wykona się printf \\ana końcu każdego polecenia, co sprawi, że terminal odtworzy dźwięk (chociaż, jak wskazuje Muru, po prostu uruchomienie przerysowania zachęty spowoduje, że terminal odtworzy dźwięk, tj. Dźwięk zostanie odtworzony za każdym razem, gdy rysowany jest nowy monit, na przykład nawet po naciśnięciu ENTER).

Jest to funkcja terminalu, więc może nie działać na wszystkich terminalach; na przykład nie działa w konsoli (ale jestem pewien, że działa w gnome-terminali xterm).

kos
źródło
5
(z zastrzeżeniem, że za każdym razem, gdy naciśniesz Enter,
usłyszysz
5

Komenda

 speaker-test

wydaje dźwięk. Najprostsze, ale irytujące rozwiązanie. :-)

Zapoznaj się z instrukcjąspeaker-test(1) dotyczącą opcji konfiguracji sygnału szumu.

kserostomus
źródło
2

Nie o to prosiłeś, ale możesz użyć do tego powiadomienia.

Zamień polecenie podane w innych odpowiedziach na

notify-send "Process terminated" "Come back to the terminal, the task is over"
przesilenie dnia z nocą
źródło
1
command && (say done ; echo done) || (echo error ; say error)

Przykład 1: echo alik && (say done ; echo done) || (echo error ; say error)da gotowe słowo.

Przykład 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)spowoduje powstanie słowa błędu.

* Potrzeby gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Twoje zdrowie.

AlikElzin-kilaka
źródło
0

Stworzyłem prosty i prawie natywny skrypt, który odtwarza dźwięk i wyświetla powiadomienie z podaną wiadomością i czasem dla 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

Jak używać?

Pierwsze uruchomienie - konfiguracja:

  1. Utwórz nowy katalog w domu i zadzwoń noti

    mkdir ~/noti
    
  2. Pobierz noti.sh i wypakuj go do powyższego katalogu noti.

  3. Otwórz Terminal i zmień katalog na noti

    cd ~/noti
    
  4. Uczyń noti.sh wykonywalnym, wydając:

    sudo chmod +x noti.sh
    
  5. Uruchom test w następujący sposób:

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

Przykłady

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"

Powiadomienie o zakończeniu procesu (przykład)

sudo apt-get update; noti "Done" "now"
Yahya
źródło
0

fala sinusoidalna ffmpeg

Dla minimalistów, możesz grać sinusoidą 1000 Hz przez 5 sekund:

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

lub na zawsze, dopóki nie zrobisz Ctrl + C:

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

Więcej informacji na: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Testowane w Ubuntu 18.04, ffmpeg 3.4.6.

Ciro Santilli
źródło