Termina automaticamente ogni comando nel terminale con un messaggio o suono diverso


21

Ho installato SVOX pico2wave e creato uno script. Ora quando entro:

speech "Hello world"

Il motore di sintesi vocale del computer dice ad alta voce "Ciao mondo". Inoltre, utilizzo nella .bashrcvariabile PROMPT_COMMANDdefinita come:

PROMPT_COMMAND="speech 'Command executed.'"

Quindi il simpatico motore text-to-voice mi annuncia forte che il comando viene eseguito, prima di restituire il prompt nel terminale.

Tuttavia, questo diventa noioso dopo un po 'e ho pensato che sarebbe davvero bello finire ogni comando nel terminale con il computer che parla una riga di testo diversa (pensa al pilota automatico di Starship Enterprise).

Così ho creato in .bashrc una variabile array, con diversi messaggi:

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

Quello che vorrei, è che ogni volta che eseguo un comando nel terminale, la variabile PROMPT_COMMANDda aggiornare e leggere una diversa riga casuale nell'array.

Presumo di aver bisogno di un ciclo, ma non sapevo come farlo.

Sarei molto grato per qualsiasi aiuto. Grazie.


Nello script nella risposta collegata, assicurati di cambiare la -l=de-DElingua locale come -l=en-US.
Terrance

Grazie davvero. Questo deve essere curato, ma l'ho fatto.
RazTaz,

Sì, questo è solo un commento in generale. Un'idea davvero interessante qui! +1
Terrance

Solo curioso: come posso installare speecheseguibile? È alias per espeak?
N0rbert,

1
"speech" è una sceneggiatura. Ho seguito le istruzioni nel link. Ho creato uno script chiamato speech.sh, comprese le correzioni indicate sopra da Terrance ". Ho salvato speech.sh nella mia cartella ~ / scripts. Ho cambiato i permessi dei file in speech.sh per renderlo eseguibile. Ho creato una cartella come segue: ~ / scripts / bin e ho seguito le istruzioni da qui stackoverflow.com/a/20054809 , al fine di aggiungerlo al PERCORSO, in modo che lo script possa essere riconosciuto come eseguibile, indipendentemente da dove mi trovo.
RazTaz,

Risposte:


22

Crea uno script e salvalo da qualche parte che contenga le tue linee e la logica per scegliere una linea casuale dal tuo array e chiama il speechcomando su quella linea:

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"

Quindi nel tuo .bashrco .profileset PROMPT_COMMAND:

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

Sostituisci semplicemente speechcon echoper ottenere un messaggio anziché la voce.


Grazie per la soluzione sopra. Sembra funzionare, tranne per il fatto che esegue il rendering solo della prima parola nella riga casuale (ad es. "Shields" o "Distribuzione ..") non dell'intera riga (ad esempio "Shields al 90%" o "Distribuzione di droidi di riparazione su dek 17. "
RazTaz,

@RazTaz Prego;)
Ravexina,

Non dovrebbe ${array[$RANDOM % ${#array[@]}]}essere tra virgolette?
Fisico pazzo,

@MadPhysicist È una buona pratica ma non è necessario qui, eseguire lo script usando set -xper vedere di cosa sto parlando :)
Ravexina,

4

Modifica tutorial in seguito:

Grazie alla risposta di Ravexina sopra, ora il problema è risolto e la soluzione funziona in modo fantastico. Di seguito fornirò istruzioni dettagliate, per le altre persone interessate a farlo funzionare in Ubuntu 18.04

1. Installa il pacchetto SVOX pico2wave:

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

2. Creare lo script vocale

cd ~/scripts
gedit speech

e metti dentro questo contenuto, inserendo l'utente corretto nel percorso:

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

salva ed esci.

3. Creare lo script shell_speech.sh come indicato da Ravexina sopra:

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"

salva ed esci.

4. Rendi eseguibili gli script e aggiungi la loro directory a PATH in modo che possano essere chiamati da qualsiasi luogo:

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

5. Modifica .bashrc

gedit ~/.bashrc

aggiungi la seguente riga:

PROMPT_COMMAND="bash shell_speech"

salva e chiudi

Nota: è possibile aggiungere tutte le nuove righe desiderate nell'array in~/scripts/bin/shell_speech


Dato che hai reso lo script eseguibile e nel file PATH, non è necessario includere bashnel tuo PROMPT_COMMANDe userei le virgolette singole nel caso in cui aggiungessi altre cose in seguito che dovranno avere un'esecuzione differita:PROMPT_COMMAND='shell_speech'
Pausa fino a ulteriore avviso.

1
Per motivi di sicurezza, è meglio scrivere /bin/bashinvece di un semplice bash... (buona pratica nel caso in cui qualcuno metta un'altra bash nel tuo percorso prima /bin...). Dovrei anche suggerirti un file casuale temporaneo nella /tmpdirectory invece che test.wava casa tua ... ps> dai un'occhiata alla fortuna .
Hastur,

@Hastur pensa per un minuto in quali circostanze il tuo presupposto può diventare realtà (es. "Qualcuno ha messo un'altra bash nel tuo percorso prima / bin"). Questo è possibile solo se qualcuno ha accesso fisico al tuo computer e / o ha già i privilegi di escalation. In entrambe le circostanze, la soluzione non sta risolvendo il problema.
RazTaz,

@RazTaz World è pieno di colori, non solo bianco e nero ! :-). Sfortunatamente ci sono molti modi per avere privilegi parziali su un sistema e usare solo bashè un modo per ottenerne di più. Link, script, permessi di scrittura su directory aperte, condivise ... Inoltre - potresti perderti - gli script possono sopravvivere al loro primo obiettivo o proprietario ... e tu (o qualcun altro) puoi usarli dopo abbastanza tempo che non ricordi tutti i comandi scritti all'interno (lo facciamo per quello), in condizioni diverse. Mettere \bin\bashcon il percorso esplicito è una buona pratica. Per evitare di farlo ... un rischio.
Hastur,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.