Mettre fin automatiquement à chaque commande dans le terminal avec un message ou un son différent

21

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 à haute voix «Bonjour tout le monde». De plus, j'utilise dans .bashrcla variable PROMPT_COMMANDdéfinie comme:

PROMPT_COMMAND="speech 'Command executed.'"

Donc, le joli moteur de synthèse vocale m'annonce haut et fort que la commande est exécutée, avant de retourner l'invite dans le terminal.

Cependant, cela devient ennuyeux après un certain temps et je pensais que ce serait vraiment cool de mettre fin à chaque commande dans le terminal avec l'ordinateur parlant une autre ligne de texte (pensez du pilote automatique de Starship Enterprise).

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 que j'exécute une commande dans le terminal, la variable PROMPT_COMMANDsoit mise à jour et lise une ligne aléatoire différente 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. Merci.

RazTaz
la source
Dans le script de la réponse liée, assurez-vous de changer le -l=de-DEdans votre langue locale comme -l=en-US.
Terrance
Merci, en effet. Cela doit être pris en charge, mais je l'avais fait.
RazTaz
Ouais, c'est juste un commentaire en général. Une idée plutôt cool ici! +1
Terrance
Juste curieux - comment installer un speechexécutable? Est-ce un alias pour espeak?
N0rbert
1
"parole" est un script. J'ai suivi les instructions du lien. J'ai créé un script appelé speech.sh, y compris les corrections indiquées ci-dessus par Terrance ". J'ai enregistré speech.sh dans mon dossier ~ / scripts. J'ai changé les permissions du fichier en speech.sh pour le rendre exécutable. J'ai créé un dossier comme suit: ~ / scripts / bin et a suivi les instructions d'ici stackoverflow.com/a/20054809 , afin de l'ajouter au CHEMIN, afin que le script puisse être reconnu comme exécutable, peu importe où je suis
RazTaz

Réponses:

22

Créez un script et enregistrez-le quelque part qui contient vos lignes et la logique pour choisir une ligne aléatoire dans votre tableau et appeler la speechcommande 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"

Puis dans votre .bashrcou .profileset PROMPT_COMMAND:

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

Remplacez simplement le speechpar echopour obtenir un message au lieu de la voix.

Ravexina
la source
Merci pour la solution ci-dessus. Il semble fonctionner, sauf qu'il ne rend que le premier mot de la ligne aléatoire (par exemple, "Shields." Ou "Deploying ..") pas la ligne entière (par exemple. "Shields at 90%" ou "Deploying repair droids on dek 17. "
RazTaz
@RazTaz Vous êtes les bienvenus;)
Ravexina
Ne devrait pas ${array[$RANDOM % ${#array[@]}]}être entre guillemets?
Mad Physicist
@MadPhysicist C'est une bonne pratique mais pas nécessaire ici, exécutez le script en utilisant set -xpour voir de quoi je parle :)
Ravexina
4

Tutoriel d'édition ultérieur:

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

1. Installez le package pico2wave SVOX:

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

2. Créez le script de discours

cd ~/scripts
gedit speech

et mettez 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.

3. 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. Rendez les scripts exécutables et ajoutez leur répertoire à PATH afin qu'ils puissent être appelés de partout:

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

5. Modifiez .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~/scripts/bin/shell_speech

RazTaz
la source
Puisque vous avez rendu le script exécutable et dans le PATH, vous n'avez pas besoin de l'inclure bashdans votre PROMPT_COMMANDet j'utiliserais des guillemets simples au cas où vous ajouteriez plus tard d'autres choses qui devront avoir une exécution différée:PROMPT_COMMAND='shell_speech'
Pause jusqu'à nouvel ordre.
1
Pour des raisons de sécurité, il vaut mieux écrire /bin/bashau lieu d'un simple bash... (bonne pratique au cas où quelqu'un mettrait un autre bash sur votre chemin avant /bin...). Je devrais même vous suggérer un fichier aléatoire aléatoire dans le /tmprépertoire plutôt que test.wavdans votre maison ... ps> donnez-lui un regard sur la fortune .
Hastur
@Hastur réfléchit une minute dans quelles circonstances votre hypothèse peut devenir vraie (c'est-à-dire "quelqu'un a mis un autre bash sur votre chemin avant / bin"). Cela n'est possible que si quelqu'un a un accès physique à votre ordinateur et / ou a déjà des privilèges élevés. Dans les deux cas, votre solution ne résout pas le problème.
RazTaz
@RazTaz World est plein de couleurs, pas seulement en noir et blanc ! :-). Malheureusement, il existe de nombreuses façons d’avoir des privilèges partiels sur un système, et n’utiliser qu’une bashfaçon d’en obtenir plus. Liens, script, autorisation d'écriture sur des répertoires ouverts, partagés ... De plus - vous pouvez le manquer - les scripts peuvent survivre jusqu'à leur premier objectif ou propriétaire ... et vous (ou quelqu'un d'autre) pouvez les utiliser après assez de temps pour vous ne vous souvenez pas de toutes les commandes écrites à l'intérieur (nous le faisons pour cela), dans des conditions différentes. Mettre \bin\bashavec le chemin explicite est une bonne pratique. Pour éviter de le faire ... un risque.
Hastur