Terminar automaticamente cada comando no terminal com uma mensagem ou som diferente

21

Eu instalei o SVOX pico2wave e criei um script. Agora, quando entro:

speech "Hello world"

O mecanismo de texto para voz do computador diz em voz alta "Olá, mundo". Além disso, eu uso na .bashrcvariável PROMPT_COMMANDdefinida como:

PROMPT_COMMAND="speech 'Command executed.'"

Portanto, o bom mecanismo de conversão de texto em voz me anuncia em voz alta que o comando é executado, antes de retornar o prompt no terminal.

No entanto, isso fica entediante depois de um tempo e eu pensei que seria muito legal finalizar cada comando no terminal com o computador falando uma linha de texto diferente (pense no piloto automático do Starship Enterprise).

Então, criei no .bashrc uma variável de matriz, com diferentes mensagens:

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

O que eu gostaria é que cada vez que eu execute um comando no terminal, a variável PROMPT_COMMANDseja atualizada e leia uma linha aleatória diferente na matriz.

Presumo que preciso de um loop, mas não sabia como fazê-lo.

Ficaria muito grato por qualquer ajuda. Obrigado.

RazTaz
fonte
No script da resposta vinculada, altere -l=de-DEpara o idioma local como -l=en-US.
Terrance
Obrigado mesmo. Isso precisa ser resolvido, mas eu o fiz.
RazTaz 10/09/18
Sim, isso é apenas um comentário em geral. Idéia bem legal aqui! +1
Terrance
Apenas curioso - como posso instalar o speechexecutável? É um apelido para espeak?
N0rbert # 10/18
1
"discurso" é um script. Eu segui as instruções no link. Criei um script chamado speech.sh, incluindo as correções indicadas acima por Terrance ". Salvei o speech.sh na minha pasta ~ / scripts. Alterei as permissões de arquivo para speech.sh para torná-lo executável. Criei uma pasta da seguinte maneira: ~ / scripts / bin e seguiu as instruções aqui stackoverflow.com/a/20054809 , para adicioná-lo ao PATH, para que o script possa ser reconhecido como executável, não importa onde eu esteja.
RazTaz

Respostas:

22

Crie um script e salve-o em algum lugar que contenha suas linhas e a lógica para escolher uma linha aleatória da sua matriz e chamar o speechcomando nessa linha:

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"

Em seguida, no seu .bashrcou .profileconjunto PROMPT_COMMAND:

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

Apenas substitua o speechpor echopara obter uma mensagem em vez da voz.

Ravexina
fonte
Obrigado pela solução acima. Parece funcionar, exceto que apenas renderiza a primeira palavra na linha aleatória (por exemplo, "Escudos" ou "Implantando ..") e não a linha inteira (por exemplo, "Escudos a 90%" ou "Implantando dróides de reparo em dek 17. "
RazTaz 10/09/18
@RazTaz De nada;)
Ravexina
Não deve ${array[$RANDOM % ${#array[@]}]}estar entre aspas duplas?
Mad Físico
@MadPhysicist É uma boa prática, mas não é necessário aqui, executar o script usando set -xpara ver o que eu estou falando :)
Ravexina
4

Tutorial de edição posterior:

Graças à resposta da Ravexina acima, agora o problema está resolvido e a solução funciona de maneira fantástica. Vou dar instruções passo a passo abaixo, para as outras pessoas interessadas em fazê-lo funcionar no Ubuntu 18.04

1. Instale o pacote SVOX pico2wave:

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

2. Crie o script de fala

cd ~/scripts
gedit speech

e coloque esse conteúdo, inserindo o usuário correto no caminho:

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

salvar e sair.

3. Crie o script shell_speech.sh conforme indicado por Ravexina acima:

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"

salvar e sair.

4. Torne os scripts executáveis ​​e adicione seu diretório ao PATH para que eles possam ser chamados de qualquer lugar:

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

5. Modifique .bashrc

gedit ~/.bashrc

adicione a seguinte linha:

PROMPT_COMMAND="bash shell_speech"

salvar e fechar

Nota: você pode adicionar quantas linhas novas desejar na matriz em~/scripts/bin/shell_speech

RazTaz
fonte
Desde que você tornou o script executável e no arquivo PATH, você não precisa incluir bashno seu PROMPT_COMMANDe eu usaria aspas simples caso você adicione outras coisas posteriormente que precisarão ter a execução adiada:PROMPT_COMMAND='shell_speech'
Pausado até novo aviso.
1
Por motivos de segurança, é melhor escrever em /bin/bashvez de um simples bash... (boas práticas, caso alguém coloque outra falha no seu caminho antes /bin...). Eu devo até sugerir um arquivo aleatório temporário no /tmpdiretório, em vez de test.wavem sua casa ... ps> dar uma olhada na fortuna .
Hastur
@Hastur pense por um minuto em que circunstâncias sua suposição pode se tornar verdadeira (ou seja, "alguém colocou outra festança no seu caminho antes / bin"). Isso é possível apenas se alguém tiver acesso físico ao seu computador e / ou já tiver escalado privilégios. Nas duas circunstâncias, sua solução não está solucionando o problema.
RazTaz 15/09/18
O @RazTaz World está cheio de cores, não apenas em preto e branco ! :-). Infelizmente, existem várias maneiras de obter privilégios parciais em um sistema, e usar somente bashé uma maneira de obter mais. Links, script, permissão de gravação em diretórios abertos, compartilhados ... Além disso - você pode perder - os scripts podem sobreviver até seu primeiro objetivo ou proprietário ... e você (ou outra pessoa) pode usá-los após um tempo suficiente que você não se lembra de todos os comandos escritos dentro (nós fazemos isso), sob diferentes condições. Colocar \bin\basho caminho explícito é uma boa prática. Para evitar fazê-lo ... um risco.
Hastur