web-dev-qa-db-fra.com

Terminez automatiquement chaque commande dans le terminal avec un message ou un son différent

J'ai installé SVOX pico2wave et créé un script. Maintenant quand j'entre:

speech "Hello world"

Le moteur de synthèse vocale de l'ordinateur dit à voix haute "Hello world". De plus, j'utilise dans .bashrc la variable Prompt_COMMAND définie par:

Prompt_COMMAND="speech 'Command executed.'"

Le moteur de synthèse vocale Nice m'annonce donc fort que la commande est exécutée avant de renvoyer l'invite dans le terminal.

Cependant, cela devient ennuyeux au bout d’un moment et j’ai pensé que ce serait vraiment bien de mettre fin à chaque commande dans le terminal avec l’ordinateur qui parle une ligne de texte différente (pensez au pilote automatique de Starship Entreprise).

J'ai donc créé dans .bashrc une variable de tableau avec différents messages:

array[0]="Shields at 90%"
array[1]="Engaging proton overdrive"
array[2]="Autopilot disengaged"
array[3]="Targetting solution available"
array[4]="Alert. Incoming missile."
array[5]="Deploying countermeasures."
array[6]="Firing torpedoes."
array[7]="Engaging auto-cannon."
array[8]="Severe damage on deck 17. Sealing off."
array[9]="Deploying repair droids to deck 17."

Ce que je voudrais, c’est que chaque fois j’exécute une commande dans le terminal, la variable Prompt_COMMAND doit être mise à jour et lire un différent ligne aléatoire dans le tableau.

Je suppose que j'ai besoin d'une boucle, mais je ne savais pas comment la faire.

Je serais très reconnaissant pour toute aide. Je vous remercie.

21
RazTaz

Créez un script et enregistrez-le quelque part qui contient vos lignes et la logique permettant de choisir une ligne aléatoire dans votre tableau et d'appeler la commande speech sur cette ligne:

array[0]="Shields at 90%"
array[1]="Engaging proton overdrive"
array[2]="Autopilot disengaged"
array[3]="Targetting solution available"
array[4]="Alert. Incoming missile."
array[5]="Deploying countermeasures."
array[6]="Firing torpedoes."
array[7]="Engaging auto-cannon."
array[8]="Severe damage on deck 17. Sealing off."
array[9]="Deploying repair droids to deck 17."

line=${array[$RANDOM % ${#array[@]}]}
speech "$line"

Ensuite, dans votre .bashrc ou .profile, définissez Prompt_COMMAND:

Prompt_COMMAND="bash $HOME/PATH/TO/myscript.sh"

Il suffit de remplacer le speech par echo pour obtenir un message au lieu de la voix.

22
Ravexina

Tutoriel d'édition ultérieur:

Grâce à la réponse de Ravexina ci-dessus, le problème est maintenant résolu et la solution fonctionne à merveille. Je donnerai des instructions étape par étape ci-dessous, aux autres personnes intéressées pour le faire fonctionner dans Ubuntu 18.04

1. Installez le paquet SVOX pico2wave:

Sudo apt-get install libttspico0 libttspico-utils libttspico-data libsox-fmt-mp3

2. Créer le script de parole

cd ~/scripts
gedit speech

et mettre ce contenu à l'intérieur, en insérant le bon utilisateur dans le chemin:

#!/bin/bash
pico2wave -l=en-US -w=/home/user/test.wav "$1"
aplay -q ~/test.wav
rm /home/user/test.wav

sauvegarder et quitter.

. Créez le script Shell_speech.sh comme indiqué par Ravexina ci-dessus:

gedit Shell_speech
array[0]="Shields at 90%"
array[1]="Engaging proton overdrive"
array[2]="Autopilot disengaged"
array[3]="Targetting solution available"
array[4]="Alert. Incoming missile."
array[5]="Deploying countermeasures."
array[6]="Firing torpedoes."
array[7]="Engaging auto-cannon."
array[8]="Severe damage on deck 17. Sealing off."
array[9]="Deploying repair droids to deck 17."

line=${array[$RANDOM % ${#array[@]}]}
speech "$line"

sauvegarder et quitter.

4. Rendre les scripts exécutables et ajouter leur répertoire à PATH pour pouvoir les appeler de partout:

chmod u+x ~/scripts/bin/speech
chmod u+x ~/scripts/bin/Shell_speech
export PATH=$PATH:~/scripts

5. Modifier .bashrc

gedit ~/.bashrc

ajoutez la ligne suivante:

Prompt_COMMAND="bash Shell_speech"

sauver et fermer

Remarque: vous pouvez ajouter autant de nouvelles lignes que vous le souhaitez dans le tableau de ~/scripts/bin/Shell_speech

4
RazTaz