Powiadom warczenie o zakończeniu zadania powłoki

12

(Specyficzne dla OSX)

Ja, podobnie jak wielu innych oprócz siebie, często zaczynam proces w powłoce, który zajmuje minutę lub dwie (na przykład duże svn commit). W tym czasie często Alt-Tab i odświeżam reddit / slashdot / wikipedia / cokolwiek. Byłoby wspaniale mieć coś skonfigurowanego, który będzie wysyłał powiadomienie o warczeniu po zakończeniu procesu powłoki.

W moim idealnym świecie wyglądałoby to tak: „Jeśli proces właśnie zakończył się z zakładki otwartej w Terminalu, opublikuj powiadomienie o warczeniu”.

Czy ktoś jeszcze skonfigurował coś takiego?

ezrock
źródło
1
Pamiętaj, że warczenie powiadomi Cię tylko wtedy, gdy nadal będziesz siedzieć przy ekranie. W przypadku dłuższych programów użyj polecenia „powiedz”, aby uzyskać dźwiękową wskazówkę, że jest zakończony.
@mankoff: Możesz skonfigurować growlnotifyustawienia powiadomień aplikacji, Growl.prefPaneaby zawierały dźwięk powiadomienia dźwiękowego. Nie można go jednak zmienić w zależności od wykonywanego polecenia, tak jak saybyłoby. Ale to o wiele mniej przerażające.
Daniel Beck

Odpowiedzi:

11

Aby to zrobić, możesz zainstalować growlnotify .

$ ./some_program && growlnotify Title -m Message

Oczywiście musisz pomyśleć o tym przed wykonaniem polecenia. Alternatywą (choć nie wiem, jak to osiągnąć) byłoby powiadomienie Growl dla każdego pojedynczego polecenia, co byłoby niesamowicie denerwujące.


Aby uprościć korzystanie z growlnotify w twoim przypadku użycia, edytuj ~/bash_profilei dodaj:

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

teraz możesz po prostu long your_command(podobnie jak sudo). Ctrl-Austawia kursor na początku wiersza, jeśli (podobnie jak ja) zawsze najpierw wpisujesz rzeczywiste polecenie, a następnie musisz dodać prefiks.

Moje bash-fu jest niestety niewystarczające, aby móc dodać polecenie do growlnotifywiadomości


według komentarza @ mankoff do tej odpowiedzi:

Możesz po prostu pisać, gdy polecenie jest uruchomione, a następnie zostanie wykonane. Utworzyłem dla siebie następującą funkcję:

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

Użyj jako gn svn.

Daniel Beck
źródło
2
Nie musisz o tym myśleć przed poleceniem. Jeśli podczas działania zauważysz, że chcesz otrzymać powiadomienie, gdy to zrobisz, po prostu wpisz „gn foo” (lub „powiedz gotowe”, aby uzyskać wskazówki dźwiękowe), naciśnij klawisz enter, a to polecenie uruchomi się, gdy bieżąca się zakończy. .
Czy komentujesz robienie tego automagicznie ... Użyj PS1 lub czegoś, by dotknąć znacznika czasu. Użyj PS2, aby sprawdzić, ile czasu minęło, zanim PS1 go dotknął. Jeśli minęło> n sekund, uruchom growlnotify. Teraz nie jest denerwujące, ponieważ nie zdarza się to przy każdym poleceniu.
@mankoff True. Wystarczy więc prosta funkcja zmniejszająca pisanie.
Daniel Beck
@mankoff PS2? Czy to nie tylko monit o kontynuację? Nie poprzedza każdej linii wyjściowej ..?
Daniel Beck
PS1 / PS2 to tylko domysły, jako miejsca, które zacznę szukać, gdybym chciał to zaimplementować. Być może całość może być osadzona w PS1. Być może istnieją zupełnie inne sposoby na stworzenie ogólnej konfiguracji warczenia za każde polecenie.
2

Potrzebny jest growlnotifyprogram CLI do wyzwalania powiadomień warczących. Możesz użyć go jako:

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

Ma jeszcze kilka pokręteł, z którymi możesz grać, użyj, growlnotify -haby uzyskać więcej informacji

roguesys
źródło
Dzięki. Właśnie skomentowałem w tym samym czasie, kiedy to znalazłem. Średnik ma również większy sens niż &&.
ezrock
1
@ezrock I rysunek można używać &&i ||mieć różne komunikaty między sukcesem a porażką stanach, ale jeśli ktoś jest zainteresowany tylko w wiadomościach pokazano po wykonaniu polecenia, a następnie ;;jest niezawodny. =)
roguesys
2

Zmodyfikowanie odpowiedzi Daniela Becka, jeśli zrobisz tę drobną zmianę, czyni ją bardzo przyjemną.

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

Następnie po uruchomieniu polecenia „long svn up” zobaczysz komunikat „svn up complete”.

Bardzo dobrze, jeśli uruchamiasz jednocześnie wiele czasochłonnych skryptów powłoki.

bmucklow
źródło
2

Teraz, gdy OSX 10.8 i nowsze wersje mają natywne powiadomienia, w ten sposób osiągam ten sam cel poprzez terminal-notifier :

  1. Zainstaluj napar
  2. $ brew install terminal-notifier
  3. Dodaj to do ~/.bash_profile:

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

Upewnij się, że zaopatrzyłeś się w swój profil . ~/.bash_profile(nie jest to konieczne w przyszłych sesjach terminalowych), ponieważ Twój profil jest pozyskiwany automatycznie podczas tworzenia sesji.

Przetestuj za pomocą ulubionego polecenia, a następnie wywołania funkcji.

ls ; gn

Argumenty skierowane do terminal-notifier mogą znieść pewne usprawnienia, ale szybka próba przechwycenia poprzedniego polecenia w celu przejścia do funkcji nie powiodła się, a to zapewnia mi całą funkcjonalność, której potrzebuję. Mianowicie dodanie, ;gnaby otrzymać powiadomienie na końcu każdego długotrwałego procesu.

ezrock
źródło
1

Jest to sposób na automatyczne wywołanie go w przypadku procesów „długo działających”: http://hints.macworld.com/article.php?story=20071009124425468

Wchodzi w proces $PROMPT_COMMANDi powiadamia o zakończeniu procesów trwających dłużej niż 10 sekund. Może być konieczne dostosowanie go do własnego środowiska i przepływu pracy (na przykład ignorowanie zakończenia lesslub wywołania edytora), ale wydaje się, że działa całkiem dobrze po wyjęciu z pudełka.

Kristian Domagala
źródło
Sam tego nie próbowałem, ale całkowicie zautomatyzowane podejście brzmi naprawdę zachęcająco. Wszystkie pozostałe rozwiązania wymagają wcześniejszej wiedzy, że polecenie będzie długo działało i pamiętania o uruchomieniu skryptu (tj. Ls; growlnotify). Podoba mi się pomysł, aby nie trzeba go ręcznie uruchamiać.
ezrock,
0

Pogrzebałem jeszcze trochę i znalazłem prostą metodę na to. Jest trochę bardziej manualny, niż bym chciał, ale proszę bardzo.

  1. Zainstaluj growlnotify (znajduje się w folderze dodatków do pobrania instalacji Growl) 1.
  2. Dołącz < && growlnotify -m "Message"> do długiego procesu.

To działa teraz dla mnie, ale mógłbym zrobić lepiej, uważa.

ezrock
źródło
0

Rozwiązanie OSX 10.9+ bez oprogramowania innych firm:

W OSX 10.9 i nowszych można użyć polecenia AppleScript, display notificationaby wyświetlić warczenie z terminala w następujący sposób:

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

Jeśli nie chcesz wpisywać tego wszystkiego za każdym razem, możesz użyć alias:

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

Przykład:

long-running-script.sh; growl
stiemannkj1
źródło