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.
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:
La manière "classique" de jouer un son est d'utiliser bip par 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.conf
et charger le module de noyau pcspkr
name__.
Sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
Sudo modprobe pcspkr
beep [optional parameters]
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
Une autre méthode consiste à utiliser l'interface de ligne de commande pulseaudio pour permettre la lecture de tous les fichiers sonores reconnus par votre système (dans libsndfile
name__) sur la sortie audio par défaut:
paplay /usr/share/sounds/freedesktop/stereo/complete.oga
Nous pouvons utiliser les fichiers son par défaut 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 bon moyen d'y parvenir en utilisant de manière abusive 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 alors installer espeak , ou utilisez alternativement spd-say "Text"
.
J'utilise
make; spd-say done
Remplacez "make" par la commande longue que vous utilisez.
Pour jouer un son après la fin de la commande:
long-running-command; sn3
(où sn3
est 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:
Voici ce que j'utilise exactement pour ce que vous demandez - à une différence près: il ne joue pas seulement un son à la fin de la commande, mais il diffuse un son différent en cas de succès et d'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 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.
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
}
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
Remplacez sound_ok
et sound_error
par d'autres sons.
Vous pouvez expérimenter avec sound
contre soundbg
et modifier sound_ok
et sound_error
afin d’utiliser des séquences de nombreux sons pour obtenir le résultat souhaité.
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 sont bons pour les notifications - sn1 est fort et gentil, sn2 est très fort et toujours joli, gentil, sn3 est extrêmement fort et pas très 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
}
Là encore, vous pouvez remplacer sound
par soundbg
si vous souhaitez 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).
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
}
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é ls
pour vous permettre de voir rapidement 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 tout en reproduisant le même son, etc.
J'ai mis ces fonctions sur GitHub, voir:
La source peut être téléchargée à partir de:
J'ai ajouté une fonction soundloop
au dépôt 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 pourrait s’attendre à travailler mais il ne le fait pas) 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é, adressez vos plaintes aux développeurs de PulseAudio.
Selon this , le caractère \a
échappe à ASCII code 7, qui correspond au bip de l'ordinateur.
Donc, echo $'\a'
fonctionne 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.
En développant la réponse de Michael Curries, vous pourriez faire en sorte que Bash imprime un BEL
(\a
) jusqu'à Prompt_COMMAND
:
Prompt_COMMAND='printf \\a'
Si vous définissez Prompt_COMMAND
de cette façon, Bash exécutera printf \\a
à la fin de chaque commande, ce qui fera jouer un son au terminal (bien que cela soit souligné par muru, le simple fait de redessiner le message Prompt fera en sorte que le terminal joue le son, être 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-terminal
et xterm
name__).
La commande
speaker-test
fait un bruit de bruit. La solution la plus simple mais ennuyeuse. :-)
Regardez le manuel de speaker-test(1)
pour connaître les options permettant de configurer le signal de bruit.
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"
command && (say done ; echo done) || (echo error ; say error)
Exemple 1: echo alik && (say done ; echo done) || (echo error ; say error)
donnera un mot fait.
Exemple 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)
entraînera une erreur Word.
* Nécessite gnustep-gui-runtime
-
Sudo apt-get install gnustep-gui-runtime
À votre santé.
J'ai créé un script simple et presque natif qui lit le son et affiche une notification avec un message et un temps 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
Créez un nouveau répertoire chez vous et appelez-le noti
mkdir ~/noti
Téléchargez noti.sh et extrayez-le dans le répertoire noti
ci-dessus.
Ouvrir le terminal et changer le répertoire en noti
cd ~/noti
Rendre noti.sh exécutable en émettant:
Sudo chmod +x noti.sh
Exécutez un test comme celui-ci:
sh ~/noti/noti.sh "Test" "now"
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"
Sudo apt-get update; noti "Done" "now"