Как получить уведомление, когда мои команды выполнены

64

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

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

Редактировать :

Я мог бы использовать, xclockно это похоже на взлом. В идеале я мог бы отправить уведомление куда угодно, например, на телефон, экран и т. Д.

Амир Афганский
источник
2
Хотя вы находитесь в командной строке, я думаю, что ответ здесь на самом деле специфичен для Mac, а не для Unix / Linux. Это потому, что я думаю, что вы, вероятно, хотите использовать Growl и grownlnotify.
Это не команда встраивания, по крайней мере, на моей коробке.
growl.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файле ищите дополнения, есть бинарный файл Growlnotify. Установите его, что-то вроде в /usr/local/bin. Тогда вы можете использовать эту команду

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

чтобы показать всплывающее окно, вот так:

рычание

Лоик Вольф
источник
2
Я использую почти такой же подход, но расширяю Growl с помощью Prowl, чтобы Growl мог отправить уведомление на мой iPhone.
Ян С.
3
Центр уведомлений «Горного льва» делает гроул ненужным ... см. Мой ответ о том, как использовать его для этого.
Том Крокетт
16

Начиная с Mac OS X Lion 10.7, в Terminal есть несколько новых индикаторов состояния, помогающих справиться с такими проблемами:

Во вкладках:

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

  • Непрочитанные: многоточие "…" отображается для обозначения нового непрочитанного текста на фоновых вкладках. При выборе вкладки индикатор очищается.

  • Оповещение: отображается «звонок», указывающий, когда BEL был записан на фоновые вкладки или фоновые окна. Кроме того, Терминал отображает красный значок на значке приложения, указывающий количество «непрочитанных» оповещений / звонков во всех терминалах. Если сам терминал находится в фоновом режиме, он также отскакивает значок Dock при воспроизведении звонка.

В свернутом окне иконки 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

Как указал Крис, Лев добавил небольшие значки уведомлений, когда выбрасывают BEL. Вы можете бросить это сами с помощью команды:

tput bel

Итак, если вы выполняете какую-то работу в фоновом режиме и хотите получить уведомление, когда она заканчивается, вы можете попробовать что-то вроде:

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

Это запускает команду ping в качестве фоновой задачи (зависание и выполняет это), и она выдает простое предупреждение, когда завершается. Исторически BEL использовался, чтобы издавать этот [ужасный] аппаратный звуковой сигнал, однако Lion со вкусом заменил его звуковым эффектом «недопустимая команда», значком уведомления и значком терминала, отскакивающим дважды в доке.

Остин Лукас
источник
1
printf '\a'будет эквивалентно tput bel. Обратите внимание, что терминал не отображает значок Dock, если в данный момент активна вкладка, вызвавшая предупреждение.
Lri
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)"), $@." &

Этот сценарий говорит код выхода напрямую, вместо двух разных сообщений. В нем также упоминается имя текущего каталога (чтобы уточнить, какая задача выполнена), и может быть дан дополнительный текст для передачи, передавая параметры псевдониму (поэтому псевдоним "$@"в нем есть). Обратите внимание на трейлинг, &чтобы вам не нужно было ждать окончания речи, прежде чем получать подсказку.


Страница людей для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 для уведомления, например: say «ant: build: done». Смотри: мужик скажи в терминале.

MST
источник
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 Integration .

При запуске длительной команды выберите: «
Правка»> «Метки и аннотации»> «Предупреждения»> «Предупреждение о следующей отметке» ( ⌥Option+ ⌘Command+ A)

Когда командная строка вернется, вы можете выбрать между:

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

Артуро Эрреро
источник
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 и должно работать со всем, что поддерживает escape-последовательности 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 escape. Обратите внимание, что это не меняет весь экран на красный, а просто выводит все данные после завершения команды.

Шервуд Ботсфорд
источник
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

randomor
источник
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 '....'
jchook
источник