Як видати звук, коли процес закінчений?


94

Я розпочав довгий процес через термінал. Чи можливо змусити термінал Ubuntu видати звук, коли процес закінчиться? Таким чином, мені не потрібно тримати перевірку, але натомість буде повідомлено звуком.


Чи можете ви пояснити далі, що ви маєте на увазі під процесом завершеним ?
Лусіо

1
Контроль @Lucio повертається назад до терміналу
Goaler444,

1
Ви маєте на увазі, відкрийте програму з терміналу і, коли вона закінчиться, видайте звук? У вас є сервер Ubuntu або ви маєте на увазі програмне забезпечення GUI?
Лусіо

2
так саме. Наприклад, я запускаю програму командного рядка, і як тільки вона закінчується і управління повертається назад до терміналу, видається звук. Зараз я використовую Ubuntu 12.10
Goaler444,

Відповіді:


78

Існують щонайменше три способи командного рядка, щоб досягти цього, поставивши команду пристосування в кінці сценарію, яку ви можете викликати для свого тривалого процесу:

  1. "Класичний" спосіб відтворення звуку - використовувати звуковий сигнал Встановіть звуковий сигнал через колонки ПК. Однак це не спрацює у всіх випадках (наприклад, у моєму системному комп'ютері динаміки повністю відключені), і вам потрібно буде видалити pscpkr /etc/modprobe/blacklist.confі завантажити pcspkrмодуль ядра.

    sudo sed -i 's/blacklist pcspkr/#blacklist pcspkr/g' /etc/modprobe.d/blacklist.conf
    sudo modprobe pcspkr
    beep [optional parameters]
    
  2. Ми також можемо відтворити будь-який звуковий файл у форматі wav за допомогою aplay (встановлений за замовчуванням):

    aplay /usr/share/sounds/alsa/Side_Right.wav
    
  3. Іншим способом є використання інтерфейсу командного рядка pulseaudio для ввімкнення відтворення будь-яких звукових файлів, які ваша система (в libsndfile) розпізнає на звуковому виході за замовчуванням:

     paplay /usr/share/sounds/freedesktop/stereo/complete.oga
    

    Ми можемо використовувати звукові файли за замовчуванням з /usr/share/sounds/будь-якого іншого звукового файлу в іншому місці.


Тільки що згадував про це, є ще один приємний спосіб досягти цього шляхом неправильного використання espeak , який встановлений за замовчуванням в Ubuntu <= 12.04. Дивіться, а точніше чуйте такий приклад:

#! /bin/bash

c=10; while [ $c -ge 0 ]; do espeak $c; let c--; done; sleep 1 ## here lengthy code
espeak "We are done with counting"

В Ubuntu> = 12.10 Orca використовує розмову-диспетчер. Потім ми можемо встановити еспік Встановити espeak або використовувати альтернативно spd-say "Text".


1
@Takkat Я використовую Ubuntu 12.10 і espeak наразі не встановлений.
Лусіо

@Lucio: Так, тепер, коли ти це кажеш ... Вони перейшли на розмову-диспетчер. Якщо це працює (це не в моїй системі), див. Редагування для використання spd-say.
Таккат

@Takkat spd-sayУтиліта встановлена ​​за замовчуванням і працює в моїй системі.
Лусіо

Також зверніть увагу на це Q / A
c0rp

1
Я мав гарний успіх уpaplay /usr/share/sounds/freedesktop/stereo/complete.oga
Ніколас ДіПіацца

73

я використовую

make; spd-say done

Замініть "make" будь-якою давно запущеною командою, яку ви використовуєте.


Ви щойно зробили мій день !! : D
n0noob

5
spd-say 'get back to work'. І поставляється попередньо встановленим: release.ubuntu.com/trusty/… , для сліпих людей, я думаю? І -wдля нескінченних циклів: while true; do spd-say -w 'get back to work you lazy bum'; done.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Я сміявся набагато сильніше, ніж повинен був.
НельсонГон

15

TL; DR

Для відтворення звуку після закінчення команди:

long-running-command; sn3

(де sn3звук № 3) помістіть це .bashrc:

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in $@; do
    paplay $s
  done
}
sn1() {
  sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
  sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
  sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}

Або читайте нижче для отримання додаткових варіантів:

Різний звук щодо помилок та успіху

Ось, що я використовую саме для того, що ви просите - з однією різницею: він не тільки відтворює звук, коли команда закінчується, але і відтворює різний звук при успіху та помилці. (Але ви можете змінити це, якщо вам це не подобається.)

У мене є функція Bash, яку називаю oksв кінці довгих команд, що виконуються:

make && make test && make install; oks

Він відтворює звук і відображає ОК або ПОМИЛКУ (з кодом помилки), коли попередня команда закінчується.

Вихідний код

Ось ця функція з двома помічниками:

sound() {
  # plays sounds in sequence and waits for them to finish
  for s in $@; do
    paplay $s
  done
}
soundbg() {
  # plays all sounds at the same time in the background
  for s in $@; do
    # you may need to change 0 to 1 or something else:
    pacmd play-file $s 0 >/dev/null
  done
}
oks() {
  # like ok but with sounds
  s=$?
  sound_ok=/usr/share/sounds/ubuntu/stereo/dialog-information.ogg
  sound_error=/usr/share/sounds/ubuntu/stereo/dialog-warning.ogg
  if [[ $s = 0 ]]; then
    echo OK
    soundbg $sound_ok
  else
    echo ERROR: $s
    soundbg $sound_error
  fi
}

Установка

Ви можете помістити його у свій ~ / .bashrc безпосередньо або помістити в якийсь інший файл, а потім помістити цей рядок у свій ~ / .bashrc:

. ~/path/to/file/with/function

Конфігурація

Зміна sound_okі sound_errorна деякі інші звуки.

Ви можете експериментувати з soundVS. soundbgі змінами sound_okі sound_errorвикористовувати послідовності багатьох звуків , які ви хотіли б отримати результат , який ви хочете.

Гарні звуки

Щоб знайти хороші звуки у вашій системі, ви можете спробувати:

for i in /usr/share/sounds/*/stereo/*; do echo $i; paplay $i; sleep 1; done

Ось деякі звуки, які я часто використовую, які доступні в Ubuntu за замовчуванням, які добре підходять для сповіщень - sn1 - це голосно і приємно, sn2 дуже гучно і все ще дуже приємно, sn3 надзвичайно гучний і не такий приємний:

sn1() {
  sound /usr/share/sounds/ubuntu/stereo/dialog-information.ogg
}
sn2() {
  sound /usr/share/sounds/freedesktop/stereo/complete.oga
}
sn3() {
  sound /usr/share/sounds/freedesktop/stereo/suspend-error.oga
}

Знову ж , ви можете змінити , soundщоб , soundbgякщо ви хочете грати у фоновому режимі , не чекаючи звуку до кінця (наприклад, не баритися ваші сценарії , коли ви граєте багато звуків).

Мовчазна версія

І про всяк випадок - тут така ж функція, як oksі без звуків:

ok() {
  # prints OK or ERROR and exit status of previous command
  s=$?
  if [[ $s = 0 ]]; then
    echo OK
  else
    echo ERROR: $s
  fi
}

Використання

Ось як ви його використовуєте:

Приклад з успіхом:

ls / && ls /bin && ls /usr; oks

Приклад з помилкою:

ls / && ls /bim && ls /usr; oks

Звичайно, на практиці команди більше схожі на:

make && make test && make install; oks

але я використав, lsщоб ви могли швидко побачити, як це працює.

Ви можете використовувати okзамість oksбезшумної версії.

Або ви можете використовувати, наприклад:

ls / && ls /bim && ls /usr; ok; sn1

друкувати ОК / ПОМИЛКА, але завжди відтворювати один і той же звук тощо

Оновлення

Я ставлю ці функції на GitHub, дивіться:

Джерело можна завантажити з:

Оновлення 2

Я додав soundloopфункцію до вищевказаного репо. Він відтворює звук і може бути перерваний Ctrl + C (на відміну від простого, while true; do paplay file.ogg; doneякий можна було б очікувати, але він не працює), як запитав Шаді в коментарях. Він реалізується як:

soundloop() {
  set +m
  a=`date +%s`
  { paplay $1 & } 2>/dev/null
  wait
  b=`date +%s`
  d=$(($b-$a))
  [ $d -eq 0 ] && d=1
  while :; do
    pacmd play-file $1 0 >/dev/null
    sleep $d
  done
}

Якщо ви вважаєте, що це складно, будь ласка, направляйте скарги розробникам PulseAudio.


Я намагався поставити це while true; do paplay ...; doneтак, щоб звук повторювався, поки не вдарив Ctrl+C, але коли я це роблю, він не ламається. Я не можу знайти жодних спеціальних варіантів, man paplayщоб зрозуміти, як змусити це працювати. Будь-які ідеї?
шаді

@shadi Дивіться мою оновлену відповідь на рішення зі звуком, який повторюється, поки ви не натиснете Ctrl + C.
rsp

14

У відповідності з цим\a символ вислизає ASCII код 7, який є сигналом комп'ютера.

Так echo $'\a'працює звуковий сигнал на моїй локальній машині, навіть коли він виконується на оболонці bash, що працює на комп'ютері, до якого я підключений через термінальний інтерфейс, як PuTTY.


3
дивовижний! це найпростіше і найкраще рішення (принаймні для мене), оскільки воно не вимагає встановлення жодних сторонніх додатків і навіть може бути введено / вставлено в середині процесу для запуску після того, як командна строка зосередиться.
hlopetz

2
Звук цього персонажа вимкнено у більшості сучасних терміналів за замовчуванням
phil294

6

Розгортаючи відповідь Майкла Керріса, ви можете змусити Баша друкувати символ BEL( \a) через PROMPT_COMMAND:

PROMPT_COMMAND='printf \\a'

Установка PROMPT_COMMANDтаким чином змусить Bash виконати printf \\aв кінці кожної команди, яка зробить термінал відтворювати звук (хоча , як Muru вказує, просто запускаючи redrawal в рядку змусить термінал відтворювати звук, тобто звук буде відтворюватися щоразу, коли з'являється нове запит, наприклад, навіть при натисканні ENTER).

Це функція терміналу, тому вона може працювати не у всіх терміналах; наприклад, він не працює в консолі (але я впевнений, що він працює gnome-terminalі в xterm).


5
(із застереженням, що кожного разу, коли ви натискаєте Enter, ви отримаєте звук)
muru


2

Це не те, що ви просили, але ви можете використовувати для цього сповіщення.

Замініть команду, подану в інших відповідях, на

notify-send "Process terminated" "Come back to the terminal, the task is over"

1
command && (say done ; echo done) || (echo error ; say error)

Приклад 1: у echo alik && (say done ; echo done) || (echo error ; say error)результаті вийде готове слово.

Приклад 2: non_existing_command_error && (say done ; echo done) || (echo error ; say error)призведе до помилки слово.

* Потреби gnustep-gui-runtime-

sudo apt-get install gnustep-gui-runtime

Ура.


0

Я створив простий і майже рідний сценарій, який відтворює звук і відображає сповіщення із заданим повідомленням та часом для Ubuntu ( Gist ):

#!/bin/sh

# https://gist.github.com/John-Almardeny/04fb95eeb969aa46f031457c7815b07d
# Create a Notification With Sound with a Given Message and Time
# The Downloaded Sound is from Notification Sounds https://notificationsounds.com/

MSSG="$1"
TIME="$2"

# install wget if not found
if ! [ -x "$(command -v wget)" ]; then 
    echo -e "INSTALLING WGET...\n\n"
    sudo apt-get install wget
    echo -e "\n\n"
fi

# install at package if not found
if ! [ -x "$(command -v at)" ]; then
    echo -e "INSTALLING AT...\n\n"
    sudo apt-get install at
    echo -e "\n\n"
fi

# install sox if not found
if ! [ -x "$(command -v sox)" ]; then
    echo -e "INSTALLING SOX...\n\n"
    sudo apt-get install sox
    sudo apt-get install sox libsox-fmt-all
    echo -e "\n\n"
fi

# download the noti sound if this is first time
# add alias to the bashrc file
if ! [ -f ~/noti/sound.mp3 ]; then
    echo -e "DOWNLOADING SOUND...\n\n"
    touch ~/noti/sound.mp3 | wget -O ~/noti/sound.mp3 "https://notificationsounds.com/wake-up-tones/rise-and-shine-342/download/mp3"
    sudo echo "alias noti=\"sh ~/noti/noti.sh\"" >> ~/.bashrc
    source ~/.bashrc        
    echo -e "\n\n"
fi

# notify with the sound playing and particular given message and time
echo "notify-send \""$MSSG\"" && play ~/noti/sound.mp3" | at $TIME

Як користуватись?

Перший запуск - налаштування:

  1. Створіть у своєму будинку новий Каталог і зателефонуйте йому noti

    mkdir ~/noti
    
  2. Завантажте noti.sh та дістаньте його до вищевказаного реєструnoti .

  3. Відкрийте термінал і змініть каталог на noti

    cd ~/noti
    
  4. Зробіть noti.sh виконуваним, видавши:

    sudo chmod +x noti.sh
    
  5. Виконайте тест так:

    sh ~/noti/noti.sh "Test" "now"
    

Приклади

noti "Hello From Noti" "now +1 minute"
noti "Hello From Noti" "now +5 minutes"
noti "Hello From Noti" "now + 1 hour"
noti "Hello From Noti" "now + 2 days"
noti "Hello From Noti" "4 PM + 2 days"
noti "Hello From Noti" "now + 3 weeks"
noti "Hello From Noti" "now + 4 months"
noti "Hello From Noti" "4:00 PM"
noti "Hello From Noti" "2:30 AM tomorrow"
noti "Hello From Noti" "2:30 PM Fri"
noti "Hello From Noti" "2:30 PM 25.07.18"

Повідомлення про закінчення процесу (приклад)

sudo apt-get update; noti "Done" "now"

0

ffmpeg синусоїда

Для мінімалістів там ви можете грати синус 1000 Гц протягом 5 секунд:

sudo apt-get install ffmpeg
ffplay -f lavfi -i "sine=frequency=1000:duration=5" -autoexit -nodisp

або назавжди, поки ви не зробите Ctrl-C:

ffplay -f lavfi -i "sine=frequency=1000" -nodisp

Більше інформації на сайті: https://stackoverflow.com/questions/5109038/linux-sine-wave-audio-generator/57610684#57610684

Тестовано в Ubuntu 18.04, ffmpeg 3.4.6.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.