Comment faire un son une fois le processus terminé?

94

J'ai entamé un long processus via un terminal. Est-il possible de faire sonner le terminal Ubuntu une fois le processus terminé? De cette façon, je n'ai pas besoin de continuer à vérifier, mais je serai averti par un son.

Goaler444
la source
Pouvez-vous expliquer davantage ce que vous entendez par processus complet ?
Lucio
1
Le contrôle @Lucio est renvoyé au terminal
Goaler444 le
1
Voulez-vous dire, ouvrez une application depuis le terminal et quand elle sera terminée, émettez un son? Avez-vous un serveur Ubuntu ou vous voulez dire un logiciel d'interface graphique?
Lucio le
2
Oui, exactement. Par exemple, je lance un programme en ligne de commande, et une fois qu'il est sorti et que le contrôle est renvoyé au terminal, un son est émis. J'utilise actuellement Ubuntu 12.10
Goaler444 le

Réponses:

78

Pour ce faire, il existe au moins trois méthodes en ligne de commande, en plaçant la commande correspondante à la fin de votre script, que vous pouvez appeler pour votre long processus:

  1. La manière "classique" de jouer un son consiste à utiliser un bip sonore Installer bip via les haut-parleurs du PC. Cependant, cela ne fonctionnera pas dans tous les cas (par exemple, dans mon système, les haut-parleurs PC sont complètement désactivés) et vous devrez supprimer pscpkr de /etc/modprobe/blacklist.confet charger le pcspkrmodule du noyau.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Nous pouvons également jouer n’importe quel fichier son au format wav en utilisant aplay (installé par défaut):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Une autre solution consiste à utiliser l'interface de ligne de commande pulseaudio pour permettre la lecture de tous les fichiers son que votre système (in libsndfile) reconnaît sur la sortie audio par défaut:

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

    Nous pouvons utiliser des fichiers son par défaut à partir de /usr/share/sounds/, ou tout autre fichier son que nous pouvons avoir à un emplacement différent.


Juste pour l'avoir mentionné, il existe un autre moyen intéressant d'y parvenir en utilisant à mauvais escient Espeak , qui est installé par défaut dans Ubuntu <= 12.04. Voir, ou plutôt entendre l'exemple suivant:

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

Dans Ubuntu> = 12.10 Orca utilise le répartiteur de parole. Nous pouvons ensuite installer espeak Installer espeak , ou bien utiliser spd-say "Text".

Takkat
la source
1
@Takkat J'utilise Ubuntu 12.10 et espeak n'est actuellement pas installé.
Lucio
@Lucio: oui, maintenant que tu le dis ... Ils sont passés à la parole-répartiteur. Si cela fonctionne (cela ne fonctionne pas sur mon système), voir edit pour utiliser spd-say.
Takkat
@Takkat L' spd-sayutilitaire est installé par défaut et fonctionne sur mon système.
Lucio
Jetez également un coup d'oeil à cette question /
réponse
1
J'ai eu un bon succès avecpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nicholas DiPiazza
73

j'utilise

make; spd-say done

Remplacez "make" par la commande longue que vous utilisez.

Memetic
la source
Vous venez de faire ma journée!! : D
n0noob
5
spd-say 'get back to work'. Et vient également pré-installé: releases.ubuntu.com/trusty/… , pour les aveugles je suppose? Et -wpour des boucles infinies: while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli a annoncé le
J'ai ri beaucoup plus fort que je n'aurais dû.
NelsonGon
15

TL; DR

Pour jouer un son après la fin de la commande:

long-running-command; sn3

(où sn3est le son numéro 3) mettez ceci dans .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 lisez ci-dessous pour plus d'options:

Son différent sur l'erreur et le succès

Voici ce que j'utilise exactement pour ce que vous demandez - à une différence près: il ne joue pas seulement un son lorsque la commande est terminée, il diffuse un son différent en cas de succès ou d'erreur. (Mais vous pouvez le changer si vous ne l'aimez pas.)

J'ai une fonction Bash appelée oksque j'utilise à la fin de longues commandes:

make && make test && make install; oks

Il émet un son et affiche OK ou ERROR (avec le code d'erreur) à la fin de la commande précédente.

Code source

Voici cette fonction avec deux assistants:

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

Vous pouvez le mettre directement dans votre ~ / .bashrc ou le placer dans un autre fichier, puis mettre cette ligne dans votre ~ / .bashrc:

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

Configuration

Changer sound_oket sound_errorà d'autres sons.

Vous pouvez expérimenter avec soundcontre soundbget le changement sound_oket sound_errord'utiliser des séquences de nombreux sons que vous aimez pour obtenir le résultat que vous voulez.

Bons sons

Pour trouver de bons sons sur votre système, vous pouvez essayer:

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

Voici quelques sons que j'utilise souvent et qui sont disponibles par défaut sur Ubuntu et qui conviennent aux notifications: le sn1 est fort et agréable, le sn2 est très fort et toujours aussi joli, le sn3 est extrêmement fort et pas si gentil:

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
}

Encore une fois, vous pouvez passer soundà soundbgsi vous voulez le jouer en arrière-plan sans attendre la fin du son (par exemple, pour ne pas ralentir vos scripts lorsque vous jouez beaucoup de sons).

Version silencieuse

Et juste au cas où - voici la même fonction que oksmais sans sons:

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

Usage

Voici comment vous l'utilisez:

Exemple avec succès:

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

exemple avec erreur:

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

Bien sûr, dans la pratique, les commandes ressemblent davantage à:

make && make test && make install; oks

mais j'ai utilisé lspour que vous puissiez voir rapidement comment cela fonctionne.

Vous pouvez utiliser à la okplace de okspour une version silencieuse.

Ou vous pouvez utiliser par exemple:

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

pour imprimer OK / ERROR tout en reproduisant le même son, etc.

Mise à jour

J'ai mis ces fonctions sur GitHub, voir:

La source peut être téléchargée à partir de:

Mise à jour 2

J'ai ajouté une soundloopfonction au rapport ci-dessus. Il joue un son et peut être interrompu par Ctrl + C (contrairement à un simple while true; do paplay file.ogg; doneque l'on s'attendrait à travailler mais ce n'est pas le cas), comme l'a demandé shadi dans les commentaires. Il est implémenté comme:

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
}

Si vous pensez que c'est compliqué, adressez vos plaintes aux développeurs de PulseAudio.

rsp
la source
J'ai essayé de le mettre de manière à while true; do paplay ...; donece que le son se répète jusqu'à ce que je frappe Ctrl+C, mais quand je le fais, ça ne casse pas. Je ne trouve aucune option spéciale man paplaypour savoir comment faire en sorte que cela fonctionne. Des idées?
Shadi
@shadi Voir ma réponse actualisée pour une solution avec un son qui se répète jusqu'à ce que vous appuyiez sur Ctrl + C.
RSP
14

Selon cela, le \acaractère échappe au code ASCII 7, qui est le bip de l'ordinateur.

Cela echo $'\a'fonctionne donc pour émettre un bip sonore sur ma machine locale, même si elle est exécutée sur un shell bash fonctionnant sur un ordinateur auquel je suis connecté via une interface de terminal telle que PuTTY.

Michael Currie
la source
3
incroyable! c'est la solution la plus simple et la meilleure (du moins pour moi) car elle ne nécessite l'installation d'aucune application tierce et peut même être tapée / collée au milieu du processus pour être exécutée après que l'invite de commande aura été activée.
hlopetz
2
le son de ce personnage est désactivé par défaut dans la plupart des terminaux modernes
phil294
6

En développant la réponse de Michael Curries, vous pouvez faire en sorte que Bash imprime un caractère BEL( \a) à travers PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

En définissant PROMPT_COMMANDcette méthode, Bash s'exécutera printf \\aà la fin de chaque commande, ce qui fera que le terminal émettra un son (bien que, comme l'indique le muru, déclencher simplement le rafraîchissement de l'invite incitera le terminal à reproduire le son, c'est-à-dire que le son sera joué. chaque fois qu'une nouvelle invite est dessinée, par exemple, même lorsque vous frappez ENTER).

Il s’agit d’une fonctionnalité de terminal; il est donc possible que cela ne fonctionne pas sur tous les terminaux; Par exemple, cela ne fonctionne pas dans la console (mais je suis sûr que cela fonctionne dans gnome-terminalet xterm).

kos
la source
5
(avec l'avertissement que chaque fois que vous appuyez sur Entrée, vous obtiendrez un son)
muru
5

La commande

 speaker-test

fait un bruit de bruit. La solution la plus simple mais ennuyeuse. :-)

Consultez le manuel despeaker-test(1) pour les options permettant de configurer le signal de bruit.

xérostome
la source
2

Ce n'est pas ce que vous avez demandé, mais vous pouvez utiliser la notification pour cela.

Remplacez la commande donnée dans les autres réponses par

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

Exemple 1: echo alik && (say done ; echo done) || (echo error ; say error)donnera un mot fini.

Exemple 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)entraînera un mot d'erreur.

* Besoins gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

À votre santé.

AlikElzin-kilaka
la source
0

J'ai créé un script simple et presque natif qui lit le son et affiche une notification avec un message et une heure donnés pour 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

Comment utiliser?

Première exécution - Mise en place:

  1. Créez un nouveau répertoire chez vous et appelez-le noti

    mkdir ~/noti
    
  2. Téléchargez noti.sh et extrayez-le dans le répertoire ci-dessus noti.

  3. Ouvrir le terminal et changer de répertoire pour noti

    cd ~/noti
    
  4. Rendre noti.sh exécutable en émettant:

    sudo chmod +x noti.sh
    
  5. Exécutez un test comme ceci:

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

Exemples

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"

Pour notifier la fin du processus (exemple)

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

ffmpeg onde sinusoïdale

Pour les minimalistes, vous pouvez jouer un sinus à 1000 Hz pendant 5 secondes:

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

ou pour toujours jusqu'à ce que vous fassiez Ctrl-C:

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

Plus d'informations sur: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Testé sous Ubuntu 18.04, ffmpeg 3.4.6.

Ciro Santilli 改造 中心 六四 事件
la source