Jak uzyskać powiadomienie, gdy moje polecenia zostaną wykonane

64

W wierszu poleceń uruchamiam serię poleceń, których wypełnienie zajmuje około dwudziestu minut. Chciałbym zobaczyć jakieś powiadomienie na moim Macu, gdy są one ukończone, więc nie muszę monitorować terminala, kiedy się skończy. Czy jest na to sposób?

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

Edytuj :

Mógłbym użyć, xclockale to wygląda na włamanie. Idealnie byłoby wysłać powiadomienie w dowolnym miejscu, na przykład na mój telefon, ekran itp.

Amir Afghani
źródło
2
Chociaż jesteś w wierszu poleceń, myślę, że odpowiedź tutaj jest specyficzna dla komputerów Mac i nie jest związana z Uniksem / Linuksem. To dlatego, że myślę, że prawdopodobnie chcesz użyć Growl i grownlnotify.
To nie jest wbudowane polecenie, przynajmniej w moim pudełku.
growl.info Growl to program, do którego odnosi się @mattdm.
jsbillings

Odpowiedzi:

58

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

Eugene Bujak
źródło
1
Jest to wspaniały przykład użycia operatorów powłoki &&do połączenia kilku poleceń i zawarcia ich w zbiorczej ||lub instrukcji, aby zgłosić błąd. +1 w rzeczy
samej
2
Miły! Aby móc to zrobić szybko, choć daję się błąd vs. informacji sukces i dodał globalny alias do mojego zsh: alias -g sd='; say done'. Oznacza to, że muszę tylko dodać sddowolne polecenie i otrzymam powiadomienie.
wrtsprt
niezłe. a teraz mam coś do zabawy
Marco Prins,
Próbowane i zarówno zrobione, jak i błędy są zawsze powtarzane :( Przykład:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka
1
Bardzo przydatny. Powtarzam, dzięki say -v Zarvoxczemu wszyscy w okolicy skaczą, to nieco mniej alarmujące powiadomienie.
Siddhartha,
52

W Mac OS 10.8 możesz wysyłać sobie wiadomości z Centrum powiadomień (podobne do Growl, ale wbudowane w Mac OS).

Sprawdź „ Wyślij alert do centrum powiadomień z wiersza poleceń w OS X ”, aby zobaczyć, jak zainstalować klejnot Ruby, który pozwoli ci wysyłać powiadomienia z wiersza polecenia. Aby uprościć typowy przypadek użycia po prostu dbania o fakt, że coś w terminalu jest wykonywane, dodaj alias do swojego .bash_profile:

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

Następnie możesz po prostu zrobić:

$ <long-running task> ; notifyDone

Po zakończeniu długotrwałego zadania otrzymasz ładne modalne okienko, które będzie się wyświetlać, dopóki go nie klikniesz:

Wyskakujące centrum powiadomień

Tom Crockett
źródło
10
Terminal-zgłaszający może zostać zainstalowany poprzez homebrew , za: brew install terminal-notifier. Następnie możesz po prostu pisać myCommand && terminal-notifier -message 'finished'. Testowane na OS X Yosemite (10.10.1).
Pwdr,
4
Powinieneś uruchomić, w myCommand; terminal-notifier -message 'finished'przeciwnym razie powiadomienie nie zostanie wyświetlone, jeśli się myCommandnie powiedzie.
aheuermann
1
Niesamowite rozwiązanie! Nawiasem mówiąc, nie generuje to żadnego dźwięku jak inne powiadomienia OS X. Jakieś rozwiązanie?
SexyBeast
1
@Cupidvogel można po prostu dodać saypolecenie, np. my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett
2
Różne odpowiedzi na to pytanie dają wiele więcej szczegółów: apple.stackexchange.com/questions/57412/...
Joshua Goldberg
20

Użyj Growl .

W .dmgpliku poszukaj dodatków, jest plik binarny growlnotify. Zainstaluj, coś w stylu /usr/local/bin. Następnie możesz użyć tego polecenia

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

aby wyświetlić wyskakujące okienko:

warczeć

Loïc Wolff
źródło
2
Używam prawie tego właśnie podejścia, ale rozszerzam Growl za pomocą Prowl , aby Growl mógł przesłać powiadomienie do mojego iPhone'a.
Ian C.
3
Mountain Lion's Notification Center sprawia, że ​​Growl jest niepotrzebny ... zobacz moją odpowiedź, jak go użyć do tego.
Tom Crockett,
16

Począwszy od Mac OS X Lion 10.7, Terminal ma kilka nowych wskaźników statusu, które pomagają w takich problemach:

W zakładkach:

  • Aktywność: wskaźnik aktywności (wskaźnik postępu wirowania) jest wyświetlany, gdy ostatnio pojawiło się wyjście na terminalu. Umożliwia to sprawdzenie, czy jest on aktualnie zajęty lub czy zakończył długi proces. (Lub, oczywiście, możesz go użyć, aby określić, kiedy zaczął produkować dane wyjściowe po cichym wykonywaniu pracy przez jakiś czas.)

  • Nieprzeczytane: wielokropek „…” jest wyświetlany, aby wskazać nowy, nieprzeczytany tekst w zakładkach w tle. Po wybraniu karty wskaźnik jest usuwany.

  • Alert: wyświetlany jest „dzwonek” wskazujący, kiedy BEL został zapisany w zakładkach lub oknach w tle. Ponadto Terminal wyświetla czerwoną plakietkę na ikonie aplikacji, wskazując liczbę „nieprzeczytanych” alarmów / dzwonków we wszystkich terminalach. Jeśli sam terminal znajduje się w tle, odbija się również ikona Docku podczas odtwarzania dzwonka.

W zminimalizowanym oknie Ikony Docku:

  • Aktywność: aktywność jest wskazywana przez wyświetlenie nazwy procesu pierwszego planu.

  • Nieprzeczytane: nieprzeczytany tekst jest oznaczony wielokropkiem.

  • Zminimalizowane okna terminali wyświetlają zawartość na żywo w ikonach Docku. Można to wykorzystać do sprawdzenia, czy istnieje aktywność, a nawet do określenia, co robi terminal, jeśli poszukiwane dane wyjściowe są możliwe do zidentyfikowania (np. „Górny” wyświetlacz jest dość łatwy do rozpoznania nawet przy małych rozmiarach). Jest to szczególnie przydatne, gdy włączone jest powiększenie Docka lub masz miejsce na duży Dock.

Ponadto możesz wyświetlić coś w terminalu, aby zwrócić twoją uwagę (co byłoby widoczne nawet w zminimalizowanych oknach). Na przykład:

  • Wyświetl dużą gwiazdkę: banner \*

  • Odwróć wyświetlacz: printf '\e[?5h'

  • Pomaluj wyświetlacz na czerwono: tput setab 1; tput clear

  • Usiądź w pętli, flashując ekran: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Istnieją również kody ucieczki do manipulowania oknami (przesuwanie, ustawianie rozmiaru, powiększanie, minimalizowanie itp.). Możesz powiększyć okno Terminala, na przykład:

printf '\e[9;1t'

Aby uzyskać szczegółowe informacje, patrz „manipulacja oknem” na stronie http://invisible-island.net/xterm/ctlseqs/ctlseqs.html .

Innym podejściem jest użycie AppleScript do wyświetlenia ostrzeżenia w osobnym oknie:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'
Chris Page
źródło
Doskonałe wykorzystanie tput i sekwencji ucieczki - masz wszystko oprócz przewijanej wiadomości w pasku tytułowym!
bmike
12

Wiem, że spóźniłem się na to pytanie, ale myślę, że brakuje trochę fragmentu, który może być pomocny. Przekonałem się, że chociaż jest fajnie, rozmowa z terminalem z tobą nie jest w pełni funkcjonalna. Lepsze jest coś bardziej subtelnego:

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

Jak zauważył Chris, Lion dodał małe odznaki powiadomień, gdy rzucany jest BEL. Możesz sam to rzucić za pomocą polecenia:

tput bel

Jeśli więc pracujesz w tle i chcesz otrzymać powiadomienie po zakończeniu, możesz spróbować czegoś takiego:

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

Spowoduje to uruchomienie polecenia ping jako zadania w tle (zawieszenie i wykonanie tego) i powiadomienie o zakończeniu po zakończeniu. Historycznie BEL był używany do tego [okropnego] sygnału sprzętowego, jednak Lion gustownie zastąpił go dźwiękowym efektem „nieprawidłowego polecenia”, plakietki powiadomienia i ikony terminala odbijającej się dwukrotnie w stacji dokującej.

Austin Lucas
źródło
1
printf '\a'byłoby równoważne z tput bel. Zauważ, że Terminal nie odbija ikony Docku, jeśli karta, która spowodowała alarm, jest obecnie aktywna.
Lri,
5

Przedstawiam w tej odpowiedzi dwie rzeczy:

  • Opcja użycia afplay, który odtwarza pliki dźwiękowe , do powiadomienia.
  • moje narzędzia do raportowania statusu wyjścia wraz z powiadomieniem.

Mam ten skrypt ~/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

Odtwarza to inny dźwięk w zależności od tego, czy argumentem jest 0. Następnie mam alias:

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

(To, że mają taką samą nazwę, jest nieistotne i prawdopodobnie zły pomysł).

Aby użyć go w np svn update . && ant clean build start; donebeep. Zauważ, że używam ;raczej niż &&, aby mógł powiadomić mnie zarówno o niepowodzeniu, jak io sukcesie.

Zanim się dowiedziałemafplay , sayzamiast tego wypowiadałem wiadomości. Rolę donebeepgrał ten skrypt:

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

Ten skrypt odczytuje kod wyjścia bezpośrednio, zamiast mieć dwie różne wiadomości. Wspomina również nazwę bieżącego katalogu (aby pomóc wyjaśnić, które zadanie jest wykonane), i można podać dodatkowy tekst do powiedzenia, przekazując parametry do aliasu (dlatego alias ma "$@"w nim). Zwróć uwagę na końcowe &, aby nie trzeba było czekać na zakończenie mowy przed wyświetleniem monitu.


Strona podręcznika dlaafplay jest niekompletna; afplay -hwyświetla wszystkie opcje:

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
Kevin Reid
źródło
4

Możesz również użyć komendy build in say do powiadomienia, np .: powiedzieć „ant: build: done”. Zobacz: mężczyzna mówi w terminalu.

mst
źródło
1

Napisałem ntfywłaśnie w tym celu. Jest wieloplatformowy i może automatycznie wysyłać powiadomienia po zakończeniu długotrwałych poleceń.

Jeśli masz Pythona pip(większość dystrybucji Linuksa i MacOS to ma), oto jak go zainstalować i włączyć automatyczne powiadomienia:

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

Sprawdź to na http://ntfy.rtfd.io

Oprócz tego może również:

  • ukrywa automatyczne powiadomienia, gdy terminal jest na pierwszym planie (X11, iTerm2 i Terminal.app są obsługiwane i domyślnie włączone)
  • wysyłać powiadomienia w chmurze (Pushover, Pushbullet i XMPP)
  • być używany do wysyłania powiadomień o zakończeniu procesu (nie wspomniane automatyczne wsparcie)
  • ręcznie wysyłać powiadomienia (dobre do użycia w skryptach!)
Daniel Schep
źródło
1

iTerm2 ma wbudowany mechanizm do otrzymywania powiadomień, ale musisz zainstalować Shell Integration .

Po uruchomieniu długotrwałego polecenia wybierz:
Edycja> Znaki i adnotacje> Alerty> Alarm przy następnym znaku ( ⌥Option+ ⌘Command+ A)

Po powrocie wiersza polecenia możesz wybrać:

  • Pokaż Modal Alert Box
  • Powiadomienie o postu (przykładowy zrzut ekranu)

Arturo Herrero
źródło
0

Ubuntu dostarcza następujący alias w ~ / .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$//'\'')"'

Dzięki temu możesz następnie wykonywać następujące czynności:

make; alert
sleep 10; alert

Być może istnieje odpowiednik notify-sendMac OSX? Widziałem podobne okienko wyskakujące w systemie Mac i Ubuntu.

Dustin Kirkland
źródło
Jesteś na stronie Apple. Aby odpowiedzieć na to pytanie, wyjaśnij, jak uzyskać dostęp do notify-sendsystemu Mac OS X.
Daniel Beck
4
Zgadzam się, że to trochę niewłaściwe, ale tak naprawdę uważam to za pomocne. Przyszedłem do tego pytania od Google, a moje pierwotne pytanie nie było specyficzne dla komputerów Mac. Podobnie jak w przypadku oryginalnego plakatu, chcę uniknąć konieczności monitorowania terminala podczas uruchamiania polecenia, które zajmuje dużo czasu; Właśnie korzystam z Ubuntu: /
allyourcode
0

Mój problem z dźwiękami i oknami modalnymi polega na tym, że nie mogę powiedzieć, skąd one pochodzą. Obecnie pracuję z dużą ilością przestrzeni, a czasem nawet z ponad 20 oknami terminali.

Moje rozwiązanie jest przenośne po stronie unixa i powinno współpracować ze wszystkim, co obsługuje sekwencje specjalne ansi. To rozwiązanie działa z systemem Snow Leopard i prawdopodobnie będzie działać z bardziej starymi wersjami terminalu.

Pojedyncza linia w .bash_profile

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

Podział tego:

$* 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.

Jeśli nie podoba ci się czerwony, kod tła kodów ucieczki google ascii. Zauważ, że nie zmienia to całego ekranu na czerwony, ale po prostu wszystko, co jest wyświetlane po zakończeniu polecenia.

Sherwood Botsford
źródło
0

Zrobiłem skrypt, aby rozwiązać ten problem, który jest tutaj . Nie potrzebujesz do tego żadnego dodatkowego oprogramowania. Instalacja:
brew install akashaggarwal7/tools/tsay
Zastosowanie:
sleep 5; tsay

Zapraszamy do współpracy!

Akash Agarwal
źródło
Powód odmowy głosowania?
Akash Agarwal
0

Oto moja funkcja bash (po prostu umieść ją w dowolnym miejscu w swoim ~/.bashrclub ~/.zshrc:

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

Aby go użyć: watch echo 'hi there'

Możesz również dostosować dźwięk powiadomienia zgodnie z dokumentacją tutaj: https://apple.stackexchange.com/a/115373/9622

losowy
źródło
0

Robię takie rzeczy przez cały czas. Moja linia poleceń może wyglądać

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

Jeśli polecenia bin/setupi bundle installzakończą się pomyślnie, usłyszę głos systemu / dyktowania: „Wszystko gotowe”. Jeśli którykolwiek z dwóch pierwszych błędów &&wystąpi, łańcuch nie będzie przestrzegany, a wszystko, co usłyszę, to „Gotowe”.

Jeff Dickey
źródło
0

Możesz użyć wbudowanego osascriptpolecenia, aby uruchomić skrypt Apple, który wyświetla powiadomienie, np

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

Możesz go połączyć razem prostym średnikiem, np

your-command ; osascript -e '....'
jchook
źródło