Уведомления Growl для завершения задачи оболочки

12

(OSX Specific)

Я, как и многие другие, кроме себя, часто запускаю процесс в оболочке, выполнение которого занимает минуту или две (например, большой коммит svn). В течение этого времени я часто alt-tab и обновляю reddit / slashdot / wikipedia / что угодно. Было бы здорово настроить что-то, что будет публиковать уведомление о рычании, когда процесс оболочки завершится.

В моем идеальном мире это работало бы так: «Если процесс только что вышел из вкладки, открытой в Терминале, отправьте уведомление о рычании».

У кого-нибудь еще есть что-то подобное?

ezrock
источник
1
Обратите внимание, что рычание будет уведомлять вас, только если вы все еще сидите на экране. Для более длинных программ используйте команду «say», чтобы получить звуковую подсказку о ее завершении.
@mankoff: вы можете настроить growlnotifyпараметры уведомлений приложения, Growl.prefPaneчтобы включить звук звукового уведомления. Это, однако, не может быть изменено в зависимости от команды, которую вы выполняете, как sayбыло бы. Но это менее жутко.
Даниэль Бек

Ответы:

11

Вы можете установить growlnotify, чтобы сделать это.

$ ./some_program && growlnotify Title -m Message

Конечно, вам нужно подумать об этом перед выполнением команды. Альтернативой (хотя я не знаю, как этого добиться) было бы уведомление Growl для каждой команды, что было бы безумно раздражающим.


Чтобы упростить использование growlnotify для вашего варианта использования, отредактируйте ~/bash_profileи добавьте следующее:

function long {
    $@
    /usr/local/bin/growlnotify Finished -m 'Done'
}

теперь вы можете просто long your_command(похоже sudo). Ctrl-Aпозиционирует курсор в начале строки, если вы (как и я) всегда сначала набираете фактическую команду, а потом должны добавить префикс.

К сожалению, моего bash-fu недостаточно для добавления команды к growlnotifyсообщению


за комментарий @ mankoff к этому ответу:

Вы можете просто напечатать во время выполнения команды, она будет выполнена позже. Я создал для меня следующую функцию:

function gn {
    /usr/local/bin/growlnotify Finished -m "$@"
}

Используйте как gn svn.

Даниэль Бек
источник
2
Вам не нужно думать об этом перед командой. Если, пока он работает, вы понимаете, что хотите получить уведомление, когда это будет сделано, просто наберите «gn foo» (или «say done» для звуковых подсказок), нажмите enter, и эта команда будет запущена после завершения текущей. ,
Вы прокомментируете это автоматически? Используйте PS1 или что-то еще, чтобы коснуться отметки времени. Используйте PS2, чтобы проверить, как долго PS1 коснулся его. Если прошло> n секунд, запустите growlnotify. Теперь это не раздражает, потому что это происходит не для каждой команды.
@mankoff Правда. Таким образом, достаточно простой функции для уменьшения набора текста.
Даниэль Бек
@mankoff PS2? Разве это не просто подсказка продолжения? Это не префикс каждой строки вывода ..?
Даниэль Бек
PS1 / PS2 были просто догадками, как места, которые я бы начал искать, если бы хотел реализовать это. Возможно, все это можно встроить только в PS1. И, возможно, есть совершенно разные способы сделать общую настройку рычагов для каждой команды.
2

Что вам нужно, так это то, growlnotifyчто CLI-программа запускает уведомления о рычании. Вы можете использовать его как:

./script.sh;; growlnotify -m "done"

Он имеет еще несколько ручек, с которыми вы можете играть, используйте growlnotify -hдля получения дополнительной информации

roguesys
источник
Благодарю. Я просто прокомментировал в то же время, когда я тоже это нашел. Точка с запятой имеет больше смысла, чем &&.
ezrock
1
@ezrock Я полагаю, что можно использовать &&и ||иметь разные сообщения между состояниями успеха и сбоя, но если кто-то заинтересован только в том, чтобы сообщение отображалось после выполнения команды, то ;;это защита от ошибок. =)
roguesys
2

Изменение ответа Даниэля Бека, если вы сделаете это небольшое изменение, сделает его очень приятным.

function long {
    command=$@
    $command
    /usr/local/bin/growlnotify Finished -m "$command completed."
}

Затем, когда вы запустите 'long svn up', вы увидите сообщение 'svn up complete'.

Очень хорошо, если вы запускаете много трудоемких сценариев оболочки одновременно.

bmucklow
источник
2

Теперь, когда OSX 10.8 и более поздние версии имеют собственные уведомления, вот как я могу достичь той же цели через терминал-уведомитель :

  1. Установить варку
  2. $ brew install terminal-notifier
  3. Добавьте это к ~/.bash_profile:

    function gn {
        terminal-notifier  -message ' ' -title 'Finished'
    }

Убедитесь, что ваш источник снабжен вашим профилем . ~/.bash_profile(не обязательно для будущих терминальных сеансов), поскольку ваш профиль создается автоматически при создании сеанса.

Проверьте с вашей любимой командой, а затем вызов функции.

ls ; gn

Аргументы для терминала-уведомителя могут несколько улучшиться, но быстрая попытка получить предыдущую команду для передачи функции не удалась, и это дает мне всю необходимую функциональность. А именно, добавление, ;gnчтобы получить уведомление в конце любого длительного процесса.

ezrock
источник
1

Это способ его автоматического вызова для «долго выполняющихся» процессов: http://hints.macworld.com/article.php?story=20071009124425468

Он подключается $PROMPT_COMMANDи уведомляет о завершении процессов, которые занимают более 10 секунд. Возможно, вам придется настроить его в соответствии с вашей собственной средой и рабочим процессом (например, игнорируя завершение lessили вызов редактора), но, похоже, он работает достаточно хорошо из коробки.

Кристиан Домагала
источник
Я сам не пробовал, но полностью автоматизированный подход звучит очень привлекательно. Все остальные решения здесь требуют заранее знать, что команда будет работать долго, и помнить о необходимости запуска скрипта (т. Е. Ls; growlnotify). Мне нравится идея, что нет необходимости вручную его запускать.
ezrock
0

Я просто еще немного покопался и нашел для этого простой метод. Это немного больше руководства, чем мне бы хотелось, но здесь все.

  1. Установите growlnotify (он находится в папке extras установочной загрузки Growl) 1.
  2. Добавить < && growlnotify -m "Message"> к длинному процессу.

Это работает для меня прямо сейчас, но я мог бы сделать лучше, я думаю.

ezrock
источник
0

Решение OSX 10.9+ без стороннего программного обеспечения:

В OSX 10.9 и выше вы можете использовать команду AppleScript, display notificationчтобы отобразить рычание с терминала, например:

osascript -e 'display notification with title "Process Completed."'

Если вы не хотите вводить все это каждый раз, вы можете использовать alias:

alias growl='osascript -e "display notification with title \"Process Completed.\""'

Пример:

long-running-script.sh; growl
stiemannkj1
источник