Beenden Sie jeden Befehl im Terminal automatisch mit einer anderen Meldung oder einem anderen Sound

21

Ich habe SVOX pico2wave installiert und ein Skript erstellt. Wenn ich jetzt eintrete:

speech "Hello world"

Die Computer-Text-to-Voice-Engine sagt laut "Hallo Welt". Außerdem benutze ich in .bashrcder Variablen PROMPT_COMMANDdefiniert als:

PROMPT_COMMAND="speech 'Command executed.'"

Die nette Text-to-Voice-Engine meldet mir also laut, dass der Befehl ausgeführt wird, bevor die Eingabeaufforderung im Terminal zurückgegeben wird.

Dies wird jedoch nach einer Weile langweilig und ich dachte, es wäre wirklich cool, jeden Befehl im Terminal zu beenden, während der Computer eine andere Textzeile spricht (denken Sie an den Autopiloten von Starship Enterprise).

Deshalb habe ich in .bashrc eine Array-Variable mit verschiedenen Meldungen erstellt:

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

Was ich möchte, ist, dass bei jeder Ausführung eines Befehls im Terminal die Variable PROMPT_COMMANDaktualisiert und eine andere zufällige Zeile im Array gelesen wird .

Ich nehme an, ich brauche eine Schleife, aber ich wusste nicht, wie ich sie machen sollte.

Ich wäre für jede Hilfe sehr dankbar. Vielen Dank.

RazTaz
quelle
Stellen Sie im Skript in der verknüpften Antwort sicher, dass Sie die Sprache -l=de-DEin Ihre Landessprache ändern -l=en-US.
Terrance
Danke in der Tat. Das muss erledigt werden, aber ich hatte es geschafft.
RazTaz
Ja, das ist nur ein Kommentar im Allgemeinen. Ziemlich coole Idee hier! +1
Terrance
Nur neugierig - wie kann ich eine speechausführbare Datei installieren ? Ist es ein Pseudonym für espeak?
N0rbert
1
"speech" ist ein Skript. Ich habe die Anweisungen im Link befolgt. Ich habe ein Skript namens speech.sh erstellt, einschließlich der oben von Terrance angegebenen Korrekturen. "Ich habe speech.sh in meinem Ordner ~ / scripts gespeichert. Ich habe die Dateiberechtigungen in speech.sh geändert, um es ausführbar zu machen. Ich habe einen Ordner wie folgt erstellt: ~ / scripts / ist und die Anweisungen von hier stackoverflow.com/a/20054809 , um es in den PATH hinzuzufügen, so kann das Skript als ausführbar, ganz gleich erkannt werden , wo ich bin.
RazTaz

Antworten:

22

Erstellen Sie ein Skript und speichern Sie es an einem Ort, der Ihre Zeilen und die Logik enthält, eine zufällige Zeile aus Ihrem Array auszuwählen und den speechBefehl in dieser Zeile aufzurufen :

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"

Dann in deinem .bashrcoder .profileSet PROMPT_COMMAND:

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

Ersetzen Sie einfach das speechdurch echo, um eine Nachricht anstelle der Stimme zu erhalten.

Ravexina
quelle
Danke für die obige Lösung. Es scheint zu funktionieren, außer dass es nur das erste Wort in der zufälligen Zeile (z. B. "Schilde" oder "Deploying ..") und nicht die gesamte Zeile (z. B. "Schilde bei 90%" oder "Deploying repair droids on") wiedergibt dek 17. "
RazTaz
@ RazTaz Gern geschehen;)
Ravexina
Sollte nicht ${array[$RANDOM % ${#array[@]}]}in doppelten Anführungszeichen stehen?
Mad Physicist
@ MadPhysicist Es ist eine gute Übung, aber hier nicht notwendig, führen Sie das Skript mit, um set -xzu sehen, was ich rede :)
Ravexina
4

Tutorial zur späteren Bearbeitung:

Dank der obigen Antwort von Ravexina ist das Problem nun gelöst und die Lösung funktioniert fantastisch. Ich werde unten eine schrittweise Anleitung für die anderen Interessenten geben, damit es unter Ubuntu 18.04 funktioniert

1. Installieren Sie das SVOX pico2wave-Paket:

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

2. Erstellen Sie das Sprachskript

cd ~/scripts
gedit speech

und füge diesen Inhalt ein und füge den richtigen Benutzer in den Pfad ein:

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

speichern und schließen.

3. Erstellen Sie das Skript shell_speech.sh wie oben von Ravexina angegeben:

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"

speichern und schließen.

4. Machen Sie die Skripte ausführbar und fügen Sie ihr Verzeichnis PATH hinzu, damit sie von überall aufgerufen werden können:

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

5. Ändern Sie .bashrc

gedit ~/.bashrc

füge die folgende Zeile hinzu:

PROMPT_COMMAND="bash shell_speech"

speichern und schließen

Hinweis: Sie können beliebig viele neue Zeilen in das Array in einfügen~/scripts/bin/shell_speech

RazTaz
quelle
Da Sie das Skript ausführbar gemacht und in das Skript eingefügt haben PATH, müssen Sie es nicht bashin Ihre PROMPT_COMMANDAnführungszeichen PROMPT_COMMAND='shell_speech'
einfügen,
1
Aus Sicherheitsgründen ist es besser, /bin/bashanstelle eines einfachen bash... zu schreiben (bewährte Methode für den Fall, dass jemand zuvor einen weiteren Schlag in den Weg stellt /bin...). Ich sollte Ihnen sogar eine zufällige temporäre Datei im /tmpVerzeichnis vorschlagen, anstatt dass test.wavSie sie zu Hause haben ... ps> geben Sie einen Blick auf das Schicksal .
Hastur
@Hastur überlege für eine Minute, unter welchen Umständen deine Annahme wahr werden kann (zB "jemand hat vor / bin eine weitere Bash in deinen Pfad gelegt"). Dies ist nur möglich, wenn jemand physischen Zugriff auf Ihren Computer hat und / oder bereits erweiterte Berechtigungen besitzt. In beiden Fällen behebt Ihre Lösung das Problem nicht.
RazTaz
@RazTaz World ist voller Farben, nicht nur schwarz und weiß ! :-). Leider gibt es viele Möglichkeiten, Teilprivilegien auf einem System zu haben, und nur diese zu nutzen, bashist eine Möglichkeit, mehr zu erhalten. Links, Skripte, Schreibrechte für geöffnete Verzeichnisse, freigegebene ... Außerdem können Skripte - Sie könnten es verpassen - bis zu ihrem ersten Ziel oder Eigentümer überleben ... und Sie (oder jemand anderes) können sie nach einer ausreichenden Zeitspanne verwenden Sie erinnern sich nicht an alle darin geschriebenen Befehle (wir tun das) unter verschiedenen Bedingungen. Es ist eine gute Praxis, \bin\bashden expliziten Pfad anzugeben. Zu vermeiden, es zu tun ... ein Risiko.
Hastur