Автоматически завершать каждую команду в терминале другим сообщением или звуком

21

Я установил SVOX pico2wave и создал скрипт. Теперь, когда я вхожу:

speech "Hello world"

Компьютерная система преобразования текста в голос произносит вслух «Привет, мир». Кроме того, я использую в .bashrcпеременной, PROMPT_COMMANDопределенной как:

PROMPT_COMMAND="speech 'Command executed.'"

Таким образом, приятный механизм преобразования текста в голос объявляет, что команда выполнена перед возвратом приглашения в терминале.

Однако через некоторое время это становится скучным, и я подумал, что было бы действительно здорово завершить каждую команду в терминале, когда компьютер произносил другую строку текста (подумайте об автопилоте Starship Enterprise).

Поэтому я создал в .bashrc переменную массива с разными сообщениями:

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

Я хотел бы, чтобы каждый раз, когда я запускаю команду в терминале, переменная PROMPT_COMMANDобновлялась и читала другую случайную строку в массиве.

Я предполагаю, что мне нужна петля, но я не знал, как это сделать.

Буду очень признателен за любую помощь. Спасибо.

RazTaz
источник
В сценарии в связанном ответе убедитесь, что вы изменили на -l=de-DEсвой местный язык, например -l=en-US.
Терренс
Спасибо большое. Об этом нужно позаботиться, но я это сделал.
RazTaz
Да, это просто комментарий в целом. Довольно крутая идея здесь! +1
Терренс
Просто любопытно - как я могу установить speechисполняемый файл? Это псевдоним для espeak?
Норберт
1
«речь» - это сценарий. Я следовал инструкциям в ссылке. Я создал скрипт под названием speech.sh, включая исправления, указанные Terrance ". Я сохранил speech.sh в своей папке ~ / scripts. Я изменил права доступа к файлам на speech.sh, чтобы сделать его исполняемым. Я создал папку следующим образом: ~ / scripts / bin и следуйте приведенным здесь инструкциям stackoverflow.com/a/20054809 , чтобы добавить его в PATH, чтобы скрипт мог быть распознан как исполняемый, где бы я ни
находился

Ответы:

22

Создайте скрипт и сохраните его где-нибудь, который содержит ваши строки и логику для выбора случайной строки из вашего массива и вызова 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"

Тогда в вашем .bashrcили .profileнаборе PROMPT_COMMAND:

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

Просто замените speechс , echoчтобы получить messge вместо голоса.

Ravexina
источник
Спасибо за вышеуказанное решение. Кажется, он работает, за исключением того, что он отображает только первое слово в случайной строке (например, «Щиты» или «Развертывание ...»), а не всю строку (например, «Щиты на 90%» или «Развертывание ремонтных дроидов на дек 17. "
RazTaz
@RazTaz Добро пожаловать;)
Равексина
Не должно ${array[$RANDOM % ${#array[@]}]}быть в двойных кавычках?
Безумный физик
@MadPhysicist Это хорошая практика, но не обязательно здесь, запустите скрипт, используя, set -xчтобы увидеть, о чем я говорю :)
Ravexina
4

Позже Редактировать Учебник:

Благодаря ответу Равексины выше, теперь проблема решена, и решение работает фантастически. Ниже я приведу пошаговые инструкции для других людей, заинтересованных в его работе в Ubuntu 18.04.

1. Установите пакет SVOX pico2wave:

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

2. Создать речевой скрипт

cd ~/scripts
gedit speech

и поместите этот контент внутрь, вставив правильного пользователя в путь:

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

Сохранить и выйти.

3. Создайте скрипт shell_speech.sh, как указано выше в Ravexina:

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"

Сохранить и выйти.

4. Сделайте скрипты исполняемыми и добавьте их каталог в PATH, чтобы их можно было вызывать откуда угодно:

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

5. Изменить .bashrc

gedit ~/.bashrc

добавьте следующую строку:

PROMPT_COMMAND="bash shell_speech"

сохранить и закрыть

Примечание: вы можете добавить столько новых строк в массив, сколько хотите~/scripts/bin/shell_speech

RazTaz
источник
Так как вы сделали скрипт исполняемым и в PATH, вам не нужно включать bashв вашем PROMPT_COMMANDи я хотел бы использовать одинарные кавычки в случае , если вы добавите другие вещи позже , что нужно будет иметь отложенное выполнение:PROMPT_COMMAND='shell_speech'
Приостановлено до дальнейшего уведомления.
1
По соображениям безопасности лучше писать /bin/bashвместо простого bash... (хорошая практика на тот случай, если кто-то вставит еще один удар на вашем пути раньше /bin...). Я должен даже предложить вам временный случайный файл в /tmpкаталоге вместо того, чтобы test.wavв вашем доме ... ps> взглянуть на удачу .
Хастур
@Hastur подумайте на минуту, при каких обстоятельствах ваше предположение может стать верным (то есть «кто-то поставил еще один удар на вашем пути перед / bin»). Это возможно, только если кто-то имеет физический доступ к вашему компьютеру и / или уже имеет повышенные привилегии. В обоих случаях ваше решение не решает проблему.
РазТаз
Мир @RazTaz полон цветов, а не только черного и белого ! :-). К сожалению, существует множество способов получить частичные привилегии в системе, и использовать только bashэто способ получить больше. Ссылки, сценарии, разрешение на запись в открытых каталогах, общих папках ... Более того - вы можете пропустить это - сценарии могут дожить до своей первой цели или владельца ... и вы (или кто-то еще) можете использовать их через достаточно времени, чтобы Вы не помните все команды, написанные внутри (мы делаем для этого), при разных условиях. Говоря \bin\bashс явным путем является хорошей практикой. Чтобы избежать этого ... риск.
Хастур