Як отримати сповіщення, коли мої команди виконані


64

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

$ svn update . && ant clean build start && *notify_me_somehow*

Редагувати :

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


2
Хоча ви знаходитесь у командному рядку, я думаю, що відповідь тут насправді специфічний для Mac, а не для Unix / Linux. Це тому, що я думаю, ви, ймовірно, хочете використовувати Growl і grownlnotify.

Це не команда складання, принаймні в моєму полі.

rowl.info Growl - це програма, на яку посилається @mattdm.
jsbillings

Відповіді:


58

(svn update . && ant clean build start && say done) || say error


1
Це чудовий приклад використання операторів оболонки &&для з'єднання декількох команд та обведення їх колективом ||чи оператором, щоб викликати помилку. +1 дійсно
bmike

2
Приємно! Для того, щоб бути в змозі зробити це швидко , хоча, я здаюся помилка проти інформації успіху і додав глобальний псевдонім моєї Zsh: alias -g sd='; say done'. Це означає, що мені потрібно лише додати sdдо будь-якої команди, і я отримаю сповіщення.
wrtsprt

хороший. а тепер у мене є з чим пограти
Марко Прінс

Перевірені, і зроблені, і помилки завжди говорять :( Приклад:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka

1
Дуже зручно. Я повторював, завдяки say -v Zarvoxчому всі в околицях стрибають, це дещо менш тривожне повідомлення.
Сіддхартха

52

У Mac OS 10.8 ви можете надсилати собі повідомлення Центру сповіщень (подібно до Growl, але вбудовані в Mac OS).

Перевірте " Надіслати сповіщення до Центру сповіщень з командного рядка в OS X ", щоб дізнатися, як встановити дорогоцінний камінь Ruby, який дозволить вам надсилати сповіщення з командного рядка. Щоб спростити звичайний випадок використання просто турботи про те, що в терміналі робиться щось, додайте псевдонім у свій .bash_profile:

alias notifyDone='terminal-notifier -title "Terminal" -message "Done with task!"'

Тоді ви можете просто зробити:

$ <long-running task> ; notifyDone

Після завершення тривалого завдання ви отримаєте гарне спливаюче вікно, яке зберігається, поки ви не натиснете на нього:

Спливаюче вікно Центру сповіщень


10
Термінал-повідомник може бути встановлений з допомогою доморощеного , теж: brew install terminal-notifier. Тоді можна просто написати myCommand && terminal-notifier -message 'finished'. Випробуваний на OS X Yosemite (10.10.1).
Pwdr

4
Вам слід запустити, myCommand; terminal-notifier -message 'finished'інакше сповіщення не відображатиметься, якщо не вдалося myCommand.
aheuermann

1
Дивовижне рішення! До речі, це не видає звуку, як інші сповіщення OS X. Будь-яке рішення для цього?
SexyBeast

1
@Cupidvogel ви можете просто додати sayкоманду, наприклад my command ; terminal-notifier -message 'finished' ; say finished
Том Крокетт

2
Різні відповіді на це питання дають багато детальніше: apple.stackexchange.com/questions/57412/…
Джошуа Голдберг

20

Використовуйте Growl .

У .dmgфайлі шукайте додатки, там є двійковий файл, який позначає зростання. Встановіть його, щось на зразок в /usr/local/bin. Потім ви можете використовувати цю команду

growlnotify --sticky --appIcon <icon> --message <message> -t <title>

щоб показати спливаюче вікно, наприклад:

гарчить


2
Я використовую майже такий точний підхід, але я продовжую Growl з Prowl, щоб Growl міг підштовхнути повідомлення на мій iPhone.
Ян C.

3
Центр сповіщень Mountain Lion робить Growl непотрібним ... дивіться мою відповідь, як його використовувати для цього.
Том Крокетт

16

Як і в Mac OS X Lion 10.7, у Terminal є нові показники стану, які допоможуть вирішити такі проблеми:

На вкладках:

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

  • Непрочитано: відображається еліпсис "..." для позначення нового, непрочитаного тексту на фонових вкладках. Вибравши вкладку, індикатор очищається.

  • Попередження: відображається "дзвінок", який вказує, коли на фонових вкладках або фонових вікнах записано BEL. Крім того, Термінал відображає червоний значок на піктограмі програми, вказуючи кількість "непрочитаних" сповіщень / дзвонів у всіх терміналах. Якщо сам Термінал знаходиться у фоновому режимі, він також відскакує свою піктограму Dock під час відтворення дзвоника.

У мінімізованому вікні значків док-станції:

  • Діяльність: активність позначається, відображаючи назву процесу переднього плану.

  • Непрочитані: непрочитаний текст позначається еліпсисом.

  • Мінімізовані вікна терміналів показують живий вміст у своїх значках Dock. Це можна використовувати, щоб дізнатися, чи є діяльність, або навіть визначити, що робить термінал, якщо вихід, який ви шукаєте, ідентифікується (наприклад, "верхній" дисплей досить легко розпізнати навіть при невеликих розмірах). Це особливо корисно, коли збільшення доку увімкнено або у вас є місце для великої доки.

Крім того, ви можете показати щось у терміналі, щоб привернути вашу увагу (що було б видно навіть у мінімізованих вікнах). Наприклад:

  • Відобразити велику зірочку: banner \*

  • Інвертувати дисплей: printf '\e[?5h'

  • Пофарбуйте дисплей у червоний колір: tput setab 1; tput clear

  • Сядьте в петлі, блимаючи екраном: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Існують також коди евакуації для керування вікнами (переміщення, встановлення розміру, масштабування, мінімізація тощо). Ви можете збільшити масштаб вікна терміналу, наприклад:

printf '\e[9;1t'

Детальні відомості див. У розділі "Маніпуляція з вікнами" на веб- сайті http://invisible-island.net/xterm/ctlseqs/ctlseqs.html .

Інший підхід полягає у використанні AppleScript для відображення попередження в окремому вікні:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'

Прекрасне використання послідовностей tput та escape - у вас є все, крім прокручуваного повідомлення в заголовку!
bmike

12

Я знаю, що я запізнююсь на запитання, але я думаю, що є невеликий фрагмент, який може бути корисним. Я виявив, що, хоча це акуратно, вести розмову з вами на терміналі не зовсім функціонально. Що краще, це щось більш субтильне, як це:

http://i.stack.imgur.com/FaZmF.png

Як зауважив Кріс, Лев додав незначні значки сповіщень, коли кинуто БЕЛ. Ви можете кинути це самостійно за допомогою команди:

tput bel

Отже, якщо ви виконуєте якусь роботу у фоновому режимі і хочете отримати сповіщення, коли воно закінчиться, ви можете спробувати щось на кшталт:

ping -c 5 www.google.com && tput bel &

Це запускає команду ping як фонове завдання (підвішування і виконує це), і вона робить просте сповіщення, коли воно закінчується. Історично БЕЛ використовувались для виготовлення цього [жахливого] ​​апаратного звукового сигналу, проте Лев зі смаком замінив його звуковим ефектом "недійсної команди", значком сповіщення та піктограмою терміналу, що підстрибує двічі на доці.


1
printf '\a'було б рівнозначно tput bel. Зауважте, що Термінал не відхиляє піктограму Dock, якщо вкладка, яка викликала сповіщення, є активною.
Лрі

5

Я в цій відповіді представляю дві речі:

  • Можливість використання afplayзвукових файлів для сповіщення.
  • мої інструменти для звітування про стан виходу разом із сповіщенням.

У мене є цей сценарій ~/bin/donebeep:

#!/bin/bash
if [ "$@" = 0 ]; then
  afplay -v 2 /System/Library/Sounds/Blow.aiff &
else
  afplay -v 2 /System/Library/Sounds/Sosumi.aiff &
fi

Це відтворює різний звук залежно від того, чи є аргумент 0. Тоді у мене є псевдонім:

alias donebeep='(savestatus=$?; ~/bin/donebeep $savestatus "$@"; exit $savestatus)'

(Те, що вони мають одне ім’я, не має значення і, мабуть, погана ідея.)

Для того, щоб використовувати його в вашому прикладі, svn update . && ant clean build start; donebeep. Зауважте, що я використовую, ;а не &&так, щоб він міг сповістити мене про невдачу та успіх.

Перш ніж я дізнався про цеafplay , я раніше sayговорив повідомлення. Роль donebeepвідіграла цей сценарій:

#!/bin/bash
say -v Bruce "Done $(basename "$(pwd)"), $@." &

Цей скрипт говорить безпосередньо вихідним кодом, а не двома різними повідомленнями. Він також згадує ім'я поточного каталогу (щоб допомогти уточнити, яке завдання виконується), і йому можна надати додатковий текст, щоб сказати, передаючи параметри псевдоніму (тому псевдонім має "$@"в ньому). Зверніть увагу на &те, що вам не потрібно чекати завершення виступу, перш ніж отримати підказку.


Сторінка man дляafplay неповна; afplay -hперелічує всі варіанти:

Usage:
afplay [option...] audio_file

Options: (may appear before or after arguments)
  {-v | --volume} VOLUME
    set the volume for playback of the file
  {-h | --help}
    print help
  { --leaks}
    run leaks analysis  {-t | --time} TIME
    play for TIME seconds
  {-r | --rate} RATE
    play at playback rate
  {-q | --rQuality} QUALITY
    set the quality used for rate-scaled playback (default is 0 - low quality, 1 - high quality)
  {-d | --debug}
    debug print output

4

Ви також можете використовувати команду build in say для оповіщення, наприклад: скажіть "ant: build: done". Дивіться: людина скаже в терміналі.



1

Я писав ntfyсаме для цієї мети. Він є кросплатформенним і може автоматично надсилати сповіщення, коли тривалі команди виконуються.

Якщо у вас є Python pip(у більшості дистрибутивів Linux та MacOS це є), ось як його встановити та включити автоматичні сповіщення:

$ sudo pip install ntfy
$ echo 'eval "$(ntfy shell-integration)"' >> ~/.bashrc
$ # restart your shell

Перевірте це на сайті http://ntfy.rtfd.io

На додаток до цього, він також може:

  • придушити автоматичні сповіщення, коли термінал знаходиться на передньому плані (X11, iTerm2 & Terminal.app підтримується та включено за замовчуванням)
  • надсилати хмарні сповіщення (Pushover, Pushbullet та XMPP)
  • використовуються для надсилання сповіщень, коли процес закінчується (не згадана автоматична підтримка)
  • вручну надсилати сповіщення (добре для використання в сценаріях!)

1

iTerm2 має вбудований механізм отримання повідомлень, але вам потрібно встановити інтеграцію Shell .

Коли ви запускаєте давно запущену команду, виберіть:
Редагувати> Позначки та примітки> Повідомлення> Сповіщення про наступну позначку ( ⌥Option+ ⌘Command+ A)

Коли командний рядок повернеться, ви можете вибрати між:

  • Показати поле модального сповіщення
  • Повідомлення про повідомлення (приклад знімка екрана)


0

Ubuntu надсилає наступний псевдонім у ~ / .bashrc:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'

За допомогою цього ви можете робити такі речі, як:

make; alert
sleep 10; alert

Можливо, notify-sendв Mac OSX є еквівалент ? Я бачив подібні спливаючі вікна як у Mac, так і в Ubuntu.


Ви на сайті Apple. Щоб відповісти на це, поясніть, будь ласка, як потрапити notify-sendна Mac OS X.
Даніель Бек

4
Я погоджуюся, що це якось недоречно, але я насправді вважаю це корисним. Я прийшов до цього питання від Google, і моє оригінальне запитання не було специфічним для Mac. Як і в оригінальному плакаті, я хочу, щоб не потрібно було контролювати мій термінал під час виконання команди, яка займає тривалий час; Я просто використовую Ubuntu: /
allyourcode

0

Моя проблема зі звуками та модальними вікнами полягає в тому, що я не можу сказати, звідки вони беруться. Зараз я працюю з купою пробілів, а іноді і вище 20 вікон терміналів.

Моє рішення є портативним на сторону unix, і повинно працювати з усім, що підтримує послідовності виходу ansi. Це рішення працює з Snow Leopard і, ймовірно, буде працювати з більш древніми версіями терміналу.

Один рядок у .bash_profile

function watch { $* ; echo -n -e "\033[41m" ;  echo $* DONE ;  date ;  echo -n -e "\033[0m" ; }

Порушення цього:

$* expands to the original command I want to watch.
first escape sequence changes background color to red
echo repeats the command (with red background, the word DONE.
Running Date tells you when it finished.
last escape resets the terminal to what it was.

Якщо вам не подобається червоний, колір тла коду втечі з google ascii. Зауважте, що це не змінює весь екран червоним, а лише все, що виводиться після завершення команди.


0

Я створив сценарій, щоб вирішити це, що тут . Для цього вам не потрібно додаткового програмного забезпечення. Установка:
brew install akashaggarwal7/tools/tsay
Використання:
sleep 5; tsay

Не соромтеся робити внесок!


Причина для голосування?
Акаш Агарвал

0

Ось моя функція bash (просто поставте її будь-де у своєму ~/.bashrcабо ~/.zshrc:

watch(){
  cmd=$@ # Somehow interpolate $@ directly doesn't work.
  $@ && say 'Watch Completed!' && osascript -e "display notification \"Completed: $cmd\" with title \"Watch Alert\""
}

Щоб використовувати його: watch echo 'hi there'

Ви також можете налаштувати звук сповіщень, як це задокументовано тут: https://apple.stackexchange.com/a/115373/9622


0

Я постійно займаюся подібними справами. Моя командна лінія може виглядати так

$ rm Gemfile.lock && bin/setup && bundle install --binstubs && say "All"; say "done"

Якщо команди bin/setupта bundle installкоманди будуть виконані успішно, я почую системний / диктантний голос, який сказав "Все готово". Якщо будь-яка з перших двох помилок вийшла, &&ланцюжок не буде дотримуватися, і все, що я почую - "Готово".


0

Ви можете використовувати вбудовану osascriptкоманду для запуску сценарію Apple, який показує сповіщення, наприклад

osascript -e 'display notification "Command done" with title "Your title here"'

Ви можете з'єднати рядок разом із простою крапкою з комою, наприклад

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