Question Comment faire un son une fois le processus terminé?


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


76
2018-04-02 18:16


origine


Pouvez-vous expliquer plus loin ce que vous entendez par processus complet? - Lucio
Le contrôle @Lucio est renvoyé au terminal - Goaler444
Voulez-vous dire, ouvrez une application à partir du terminal et quand elle est terminée, faites un son? Avez-vous un serveur Ubuntu ou un logiciel d'interface graphique? - Lucio
Oui, exactement. Par exemple, je lance un programme de 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


Réponses:


Il existe au moins trois méthodes de ligne de commande pour y parvenir en plaçant la commande appropriée à la fin de votre script, que vous pouvez appeler pour votre long processus:

  1. La manière "classique" de jouer un son est d'utiliser bip  Install beep  à travers les haut-parleurs 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.conf et charger le pcspkr module 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 lire tout fichier audio au format wav en utilisant aplay (installé par défaut):

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

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

    Nous pouvons utiliser les fichiers audio par défaut de /usr/share/sounds/, ou tout autre fichier audio que nous pouvons avoir à un autre endroit.


Juste pour l'avoir mentionné, il y a une autre belle façon d'y parvenir en abusant 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 Speak-Dispatcher. Nous pouvons alors installer espeak  Install espeak, ou bien utiliser spd-say "Text".


69
2018-04-02 18:40



@Takkat J'utilise Ubuntu 12.10 et espeak n'est actuellement pas installé. - Lucio
@ Lucio: ouais, maintenant que tu le dis ... Ils ont changé de langage. Si cela fonctionne (cela ne figure pas sur mon système), voir edit pour utiliser spd-say. - Takkat
@Takkat Le spd-say L'utilitaire est installé par défaut et fonctionne sur mon système. - Lucio
Jetez également un oeil à cela Q / A - c0rp
J'ai eu un bon succès avec paplay /usr/share/sounds/freedesktop/stereo/complete.oga - Nicholas DiPiazza


j'utilise

make; spd-say done

Remplacez "make" par la commande que vous utilisez depuis longtemps.


60
2018-02-19 23:58



Vous venez de faire ma journée!! :RÉ - n0noob
spd-say 'get back to work'. Et est également pré-installé: releases.ubuntu.com/trusty/… , je suppose que pour les aveugles? Et -w pour les boucles infinies: while true; do spd-say -w 'get back to work you lazy bum'; done. - Ciro Santilli 新疆改造中心 六四事件 法轮功


Selon ce la \a caractère échappe au code ASCII 7, qui est le bip de l'ordinateur.

Alors echo $'\a' fonctionne pour émettre un bip sonore sur mon ordinateur local, même s'il est exécuté sur un shell bash fonctionnant sur un ordinateur auquel je suis connecté via une interface de terminal telle que PuTTY.


11
2017-09-13 19:39



incroyable! C'est la solution la plus simple et la meilleure (du moins pour moi) car elle ne nécessite pas d’application tierce et peut même être saisie / collée au milieu du processus pour être exécutée une fois que l’invite de commande aura le focus. - hlopetz
le son de ce personnage est désactivé par défaut dans la plupart des terminaux modernes - Blauhirn


TL; DR

Pour jouer un son après la commande se termine:

long-running-command; sn3

(où sn3 est le son numéro 3) mettre cela 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:

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

Voici ce que j'utilise pour exactement ce que vous demandez - avec une différence: il ne joue pas seulement un son lorsque la commande est terminée mais différent son sur le succès et sur l'erreur. (Mais vous pouvez le changer si vous ne l'aimez pas.)

J'ai une fonction Bash appelée oks que j'utilise à la fin des longues commandes:

make && make test && make install; oks

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

Code source

Voici cette fonction avec deux aides:

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 mettre dans un autre fichier, puis placer cette ligne dans votre ~ / .bashrc:

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

Configuration

Changement sound_ok et sound_error à d'autres sons.

Vous pouvez expérimenter avec sound contre. soundbg et changer sound_ok et sound_error utiliser des séquences de nombreux sons que vous aimez pour obtenir le résultat souhaité.

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 sur Ubuntu par défaut et qui sont bons pour les notifications - sn1 est fort et sympa, sn2 est très bruyant et assez joli, sn3 est extrêmement fort et pas très agréable:

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 changer sound à soundbg si vous voulez le lire 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 oks mais 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 plus à:

make && make test && make install; oks

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

Vous pouvez utiliser ok au lieu de oks pour une version silencieuse.

Ou vous pouvez utiliser par exemple:

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

pour imprimer OK / ERROR mais toujours jouer le même son, etc.

Mettre à jour

Je mets ces fonctions sur GitHub, voir:

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

Mise à jour 2

J'ai ajouté un soundloop fonction au repo ci-dessus. Il joue un son et peut être interrompu par Ctrl + C (contrairement à un simple while true; do paplay file.ogg; done que l'on s'attendrait à travailler, mais ce n'est pas le cas) comme demandé par 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é, veuillez adresser vos plaintes aux développeurs de PulseAudio.


11
2018-04-01 19:24



J'ai essayé de mettre cela dans un while true; do paplay ...; done afin que le son 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 dans man paplay pour comprendre comment faire fonctionner cela. Des idées? - shadi
@shadi Voir ma réponse mise à jour pour une solution avec un son qui se répète jusqu'à ce que vous appuyiez sur Ctrl + C. - rsp


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

PROMPT_COMMAND='printf \\a'

Réglage PROMPT_COMMAND de cette façon fera Bash exécuter printf \\a à la fin de chaque commande, le terminal jouera un son (bien que, comme le fait remarquer Muru, le simple fait de redessiner le message incitera le terminal à jouer le son, c.-à-d. , par exemple même en frappant simplement ENTRER).

Il s’agit d’une fonctionnalité de terminal, elle peut donc ne pas fonctionner 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).


6
2018-03-06 20:25



(avec l’avertissement que chaque fois que vous appuyez sur Entrée, vous obtenez un son) - muru


La commande

 speaker-test

fait du bruit. Solution la plus simple mais ennuyeuse. :-)

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


3
2017-11-01 08:01





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

Exemple 1: echo alik && (say done ; echo done) || (echo error ; say error) entraînera un mot fait.

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é.


1
2018-05-23 11:23





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"

1
2018-03-30 14:07





J'ai créé un script simple et presque natif qui lit le son et affiche une notification avec un message donné et l'heure pour Ubuntu (Essentiel):

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

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

    mkdir ~/noti
    
  2. Télécharger noti.sh  et l'extraire de ce qui précède noti dir.

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

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

    sudo chmod +x noti.sh
    
  5. Exécutez un test comme celui-ci:

    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"

0
2017-07-10 14:02