Bir işlem tamamlandıktan sonra nasıl ses çıkarılır?


94

Bir terminal aracılığıyla uzun bir süreç başlattım. İşlem tamamlandığında Ubuntu terminalinin ses çıkarması mümkün müdür? Bu şekilde kontrol etmeye devam etmeme gerek yok, bunun yerine ses aracılığıyla bilgilendirileceksiniz.


İşlem tamamlandıktan sonra ne kastediyorsunuz ?
Lucio

1
@ Lucio kontrolü terminale geri döndü
Goaler444

1
Terminalden bir uygulama açıp bitirince ses çıkarmayı mı kastediyorsunuz? Bir Ubuntu sunucunuz mu var yoksa GUI yazılımı mı demek istiyorsunuz?
Lucio

2
Evet kesinlikle. Mesela ben bir komut satırı programı başlatıyorum ve bir kez çıkar ve kontrol terminale geri döndüğünde bir ses çıkar. Şu anda Ubuntu 12.10 kullanıyorum
Kaleci444

Yanıtlar:


78

Sulama komutunu betiğinizin sonuna getirerek, uzun işleminiz için çağırabileceğiniz en az üç komut satırı yolu vardır:

  1. Ses çalmanın "klasik" yolu PC hoparlörleri üzerinden bip sesi kullanmaktır Bip sesi yükleyin. Ancak bu her durumda işe yaramayacaktır (örn. Sistemimdeki PC hoparlörlerim tamamen devre dışıdır) ve pscpkr'yi çekirdek modülünden çıkarmanız /etc/modprobe/blacklist.confve pcspkrçekirdek modülünü yüklemeniz gerekir .

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Ayrıca aplay kullanarak herhangi bir ses dosyasını wav formatında çalabiliriz (varsayılan olarak yüklenir):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Başka bir yol da, sisteminizde (in libsndfile) varsayılan ses çıkışında tanıdığı ses dosyalarının oynatılmasını sağlamak için pulseaudio komut satırı arayüzünü kullanmaktır :

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

    Varsayılan ses dosyalarını /usr/share/sounds/veya farklı bir konumdaki diğer ses dosyalarını kullanabiliriz .


Sadece bahsetmiş olmak gerekirse , Ubuntu <= 12.04 içine varsayılan olarak yüklenen espeak'i yanlış kullanarak bunu başarmanın başka bir güzel yolu var . Aşağıdaki örneği görün veya duyun:

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

Ubuntu'da> = 12.10 Orca speak-dispatcher kullanıyor. Daha sonra espeak'i kurabilir Espeak yükleyinveya alternatif olarak kullanabilirsiniz spd-say "Text".


1
@Takkat Ubuntu 12.10 kullanıyorum ve espeak şu anda yüklü değil.
Lucio

@ Lucio: evet, şimdi söylediğinize göre ... Konuşmacı-konuşmacıya geçtiler. Bu işe yararsa (sistemimde çalışmıyor) kullanmak için düzenlemeye bakın spd-say.
Takkat

@Takkat Hizmet spd-sayprogramı varsayılan olarak yüklenir ve sistemimde çalışır.
Lucio

Ayrıca bu Q / A
c0rp

1
Ben iyi neticeler aldığıpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza

73

kullanırım

make; spd-say done

Kullandığınız uzun süren komutla "make" ifadesini değiştirin.


Az önce günümü yaptın !! : D
n0noob 11:15

5
spd-say 'get back to work'. Ve önceden yüklenmiş olarak geliyor: releases.ubuntu.com/trusty/… , sanırım kör insanlar için? Ve -wsonsuz döngüler için: while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli,

Olması gerekenden çok daha fazla güldüm.
NelsonGon

15

TL; DR

Komut bittikten sonra bir ses çalmak için:

long-running-command; sn3

( sn3ses numarası 3 nerede ) şunu içine koy .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
}

Veya daha fazla seçenek için aşağıyı okuyun:

Hata ve başarıda farklı ses

İşte tam olarak ne istediğin için kullandığım şey - tek bir farkla: sadece komut bittiğinde bir ses çalmıyor , başarıda ve hatada farklı bir ses çalıyor . (Ama sevmediysen değiştirebilirsin.)

oksUzun süren komutların sonunda kullandığım denilen Bash işlevim var :

make && make test && make install; oks

Bir ses çalar ve önceki komut tamamlandığında OK veya ERROR (hata koduyla) görüntüler.

Kaynak kodu

İşte iki yardımcı ile bu işlev:

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
}

Kurulum

Bunu doğrudan ~ / .bashrc dosyasına koyabilir veya başka bir dosyaya koyabilir ve ardından bu satırı ~ / .bashrc dosyasına koyabilirsiniz:

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

Yapılandırma

Değiştir sound_okve sound_errordiğer bazı seslere

Sen deneyebilirsiniz soundvs. soundbgve değişim sound_okve sound_erroristediğiniz sonucu almak ister birçok seslerin dizileri kullanmak.

Güzel sesler

Sisteminizde bazı iyi sesler bulmak için deneyebilirsiniz:

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

Varsayılan olarak Ubuntu'da mevcut olan ve varsayılan olarak bildirimler için uygun olan bazı sesler var - sn1 çok gürültülü ve güzel, sn2 çok yüksek ve hala çok güzel, sn3 çok yüksek ve çok hoş değil:

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
}

Yine, değiştirebilir soundiçin soundbgses (eğer sesler çok oynarken mesela senaryolarınızı yavaşlatmak değil) bitirmek için beklemeden arka planda oynamak istiyorum.

Sessiz sürüm

Ve sadece durumda - işte okssesler ile aynı fonksiyonlar :

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

kullanım

İşte nasıl kullandığınız:

Başarı ile Örnek:

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

hata ile örnek:

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

Elbette pratikte komutlar daha çok benziyor:

make && make test && make install; oks

ama ben lsnasıl kullanılacağını hızlıca görebilmek için kullandım .

Sessiz bir sürüm okyerine kullanabilirsiniz oks.

Veya örneğin kullanabilirsiniz:

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

OK / ERROR yazdırmak ancak her zaman aynı sesi çalmak vb.

Güncelleme

Bu işlevleri GitHub'a koydum, bkz:

Kaynak şu adresten indirilebilir:

Güncelleme 2

soundloopYukarıdaki depoya bir fonksiyon ekledim . Bir ses çalar ve yorumlarda shadiwhile true; do paplay file.ogg; done tarafından istendiği gibi Ctrl + C ( çalışmayı beklediğinden daha basit ama aksine) kesilebilir . Olarak uygulanır:

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
}

Karmaşık olduğunu düşünüyorsanız, lütfen şikayetlerinizi PulseAudio geliştiricilerine iletin.


Bunu while true; do paplay ...; done, sesimi vuruncaya kadar tekrar edecek şekilde yerleştirmeye çalıştım Ctrl+C, ancak yaptığımda, bozulmuyor. Bunun man paplaynasıl işe yarayacağını bulmak için özel bir seçenek bulamıyorum . Herhangi bir fikir?
shadi

@shadi Ctrl + C tuşlarına basana kadar tekrarlayan seslere sahip bir çözüm için güncellenmiş yanıtımı görün.
rsp

14

Göre bu\a karakter bilgisayarın bip olan ASCII kodu 7, kaçar.

Bu yüzden echo $'\a'yerel makinemde bir bip sesi çıkarmaya çalışıyor, bilgisayarda çalışan bir bash kabuğunda çalıştırılsa bile, PuTTY gibi bir terminal arayüzü üzerinden bağlanıyorum.


3
inanılmaz! bu en kolay ve en iyi çözümdür (en azından benim için), çünkü herhangi bir 3. parti uygulamayı yüklemeyi gerektirmez ve komut isteminin odaklanmasından sonra çalıştırılacak işlemin ortasına bile yazılabilir / yapıştırılabilir.
hlopetz

2
bu karakterin sesi çoğu modern terminalde varsayılan olarak devre dışı bırakılmıştır
phil294

6

Michael Curries'in cevabını genişleterek, Bash'in aşağıdakileri yoluyla BEL( \a) karakterini basmasını sağlayabilirsiniz PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

PROMPT_COMMANDBu şekilde ayarlamak Bash'in printf \\aher komutun sonunda çalışmasını sağlar, bu da terminalin sesini çalmasını sağlar (muru'nun işaret ettiği gibi, sadece istemin yeniden çekilmesini tetiklemek terminalin sesini çalmasını sağlar, yani ses çalınır) her seferinde yeni bir bilgi istemi yapılır, örneğin sadece vurulduğunda bile ENTER).

Bu bir terminal özelliğidir, bu nedenle tüm terminallerde çalışmayabilir; örneğin konsolda çalışmıyor (ama çalıştığından eminim gnome-terminalve xterm).


5
(Enter tuşuna her bastığınızda, bir ses elde
edeceğiniz ihbarı ile


2

İstediğin bu değil ama bunun için bildirim kullanabilirsin.

Diğer cevaplarda verilen komutu yerine

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

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

Örnek 1: echo alik && (say done ; echo done) || (echo error ; say error)biten bir kelimeyle sonuçlanacaktır.

Örnek 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)bir hata kelimesiyle sonuçlanacaktır.

* İhtiyaçlar gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Şerefe.


0

Ses çalan ve Ubuntu ( Gist ) için Verilen Mesaj ve Zaman ile bir Bildirim görüntüleyen basit ve neredeyse yerel bir komut dosyası oluşturdum :

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

Nasıl kullanılır?

İlk Çalıştırma - Ayarlama:

  1. Evinizde yeni bir Dizin oluşturun ve arayın noti

    mkdir ~/noti
    
  2. Noti.sh dosyasını indirin ve yukarıdaki dizine çıkartın noti.

  3. Terminal'i açın ve Dizini Değiştir noti

    cd ~/noti
    
  4. Noti.sh dosyasını yayınlayarak çalıştırılabilir duruma getirin:

    sudo chmod +x noti.sh
    
  5. Bunun gibi bir Test yapın:

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

Örnekler

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"

Sürecin Sonunu Bildirmek İçin (örnek)

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

0

ffmpeg sinüs dalgası

Dışarıdaki minimalistler için 5 saniye boyunca 1000 Hz sinüs çalabilirsiniz:

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

veya Ctrl-C yapana kadar sonsuza dek:

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

Daha fazla bilgi için: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Ubuntu 18.04'te test edildi, ffmpeg 3.4.6.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.