Komutlarım bittiğinde bildirim nasıl alınır


64

Komut satırında yaklaşık yirmi dakika süren bir dizi komut çalıştırıyorum. Bunlar bittiğinde Mac'imde bir tür bildirim görmek istiyorum, bu yüzden terminali bittiği zaman izlemem gerekmiyor. Bunu yapmanın bir yolu var mı?

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

Düzenle :

Kullanabilirim xclockama bu bir hack gibi görünüyor. İdeal olarak bildirimi telefonum, ekranım vb. Her yere gönderebilirim.


2
Komut satırında olsanız da, buradaki cevabın aslında Mac'e özgü olduğunu ve Unix / Linux ile ilgili olmadığını düşünüyorum. Bunun nedeni, muhtemelen Growl ve grownlnotify.

En azından benim kutumda bu bir emir değil.

growl.info Growl, @ mattdm tarafından belirtilen programdır.
jsbillings

Yanıtlar:


58

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


1
Bu, &&birkaç komutu bir araya getirmek ve ||bir hatayı yükseltmek için bir kollektif veya deyimle sarmak için kabuk operatörlerini kullanmanın harika bir örneğidir . Gerçekten de +1
bmike

2
Güzel! Bunu hızlıca yapabilmek için, hataya karşılık başarı bilgisinden vazgeçtim ve zsh: 'a global bir takma ad ekledik alias -g sd='; say done'. Bu, yalnızca sdherhangi bir komuta eklemem gerektiği ve haberdar olacağım anlamına gelir .
wrtsprt

güzel. ve şimdi oynayacağım bir şey var
Marco Prins

Denenmiş ve hem yapılmış hem de hata her zaman söylenir :( Örnek:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka

1
Çok kullanışlı. Çevremizdeki say -v Zarvoxherkesin atlamasını sağlayan yankılanıyordum , bu biraz daha az endişe verici bir bildirim.
Siddhartha,

52

Mac OS 10.8'de kendinize Notification Center mesajları gönderebilirsiniz (Growl'a benzer ancak Mac OS'de yerleşiktir).

Check out " OS X komut satırından Bildirim Merkezi bir Uyarısı gönder komut satırından bildirimleri göndermek sağlayacak bir Ruby mücevher yükleme görmek için". Yaygın olarak kullanılmakta olan terminaldeki bir şeyin gerçeğine dikkat etmenin yaygın kullanımını kolaylaştırmak için .bash_profile dosyasına bir takma ad ekleyin:

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

O zaman yapabilecekleriniz:

$ <long-running task> ; notifyDone

Uzun süren görev bittiğinde, üzerine tıklayana kadar devam eden güzel bir modal açılır penceresi alacaksınız:

Bildirim Merkezi açılır penceresi


10
terminal bildirim ile kurulabilir homebrew de: brew install terminal-notifier. O zaman sadece yazabilirsin myCommand && terminal-notifier -message 'finished'. OS X Yosemite (10.10.1) üzerinde test edilmiştir.
Pwdr

4
myCommand; terminal-notifier -message 'finished'Aksi halde çalıştırmalısınız , myCommandbaşarısız olursa bildirim gösterilmez .
aheuermann

1
Müthiş bir çözüm! Bu arada, bu diğer OS X bildirimleri gibi herhangi bir ses üretmiyor. Bunun için herhangi bir çözüm?
SexyBeast

1
@Cupidvogel sadece bir saykomut ekleyebilirsiniz , örneğin my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett

2
Bu sorunun çeşitli yanıtları çok daha fazla ayrıntı verir: apple.stackexchange.com/questions/57412/…
Joshua Goldberg

20

Growl kullanın .

Gelen .dmgdosya ekstralar için, bir growlnotify ikili var bak. Yükle, içindeki gibi bir şey /usr/local/bin. O zaman bu komutu kullanabilirsin

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

Bir açılır pencereyi göstermek için, şöyle:

Büyün


2
Neredeyse bu tam yaklaşımı kullanıyorum ancak Growl'u Prowl ile genişletiyorum, böylece Growl bildirimi iPhone'uma aktarabilir.
Ian C.

3
Mountain Lion'un Bildirim Merkezi, Growl'u gereksiz kılıyor ... bunun için nasıl kullanılacağına dair cevabımı görün .
Tom Crockett

16

Mac OS X Lion 10.7'den itibaren, Terminal, bu gibi konularda yardımcı olacak bazı yeni durum göstergelerine sahiptir:

Sekmelerde:

  • Aktivite: terminale yeni bir çıkış yapıldığında bir aktivite göstergesi (eğirme ilerleme göstergesi) görüntülenir. Bu, şu anda meşgul mü yoksa uzun bir işlemi tamamlayıp tamamlamadığınızı görmenizi sağlar. (Veya, tabii ki, bir süre sessizce iş yaptıktan sonra çıktı üretmeye ne zaman başladığını söylemek için kullanabilirsiniz.)

  • Okunmamış: arka plan sekmelerinde yeni ve okunmamış metni göstermek için bir elips "…" görüntüleniyor. Sekmeyi seçtiğinizde, gösterge silinir.

  • Uyarı: Bir BEL'nin arka plan sekmelerine veya arka plan pencerelerine ne zaman yazıldığını gösteren bir "çan" görüntülenir. Ek olarak, Terminal uygulama simgesinde, tüm terminallerde "okunmamış" uyarı / zil sayısını belirten kırmızı bir işaret görüntüler. Terminal arka planda ise, bir zil çalınırken Dock simgesini de zıplar.

Simge durumuna küçültülmüş pencerede Dock simgeleri:

  • Etkinlik: Etkinlik, ön plan işleminin adı gösterilerek gösterilir.

  • Okunmamış: okunmamış metin bir üç nokta ile gösterilir.

  • Küçültülmüş terminal pencereleri Canlı içeriği Dock simgelerinde gösterir. Bu, faaliyet olup olmadığını görmek veya hatta terminalin ne yaptığını belirlemek için, aradığınız çıktı tanımlanabilirse (örneğin, "üst" bir ekranın küçük boyutlarda bile tanınması oldukça kolaydır) kullanılabilir. Bu, özellikle Dock büyütme açık olduğunda ya da büyük bir Dock için yeriniz olduğunda kullanışlıdır.

Ek olarak, dikkatinizi çekmek için terminalde bir şey görüntüleyebilirsiniz (küçültülmüş pencerelerde bile görünür). Örneğin:

  • Büyük bir yıldız işareti göster: banner \*

  • Ekranı ters çevirin: printf '\e[?5h'

  • Ekranı kırmızıya boyayın: tput setab 1; tput clear

  • Ekranda yanıp sönen bir döngüde oturun: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Pencereleri değiştirmek için kaçış kodları da vardır (taşıma, ayarlanan boyut, yakınlaştırma, simge durumuna küçültme vb.). Terminal penceresini yakınlaştırabilirsiniz, örneğin:

printf '\e[9;1t'

Detaylar için http://invisible-island.net/xterm/ctlseqs/ctlseqs.html adresindeki "pencere manipülasyonu" bölümüne bakın .

Başka bir yaklaşım, bir uyarıyı ayrı bir pencerede görüntülemek için AppleScript kullanmaktır:

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

Mükemmel tput kullanımı ve kaçış dizileri - başlık çubuğunda kaydırma mesajı dışında her şeye sahipsiniz!
bmike

12

Soruya geç kaldığımı biliyorum ama yardımcı olabilecek küçük bir parça olduğunu düşünüyorum. Düzgün olmasına rağmen, terminalinin seninle konuşmasının tamamen işlevsel olmadığını gördüm. Daha iyisi, böyle daha ince bir şey:

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

Chris'in belirttiği gibi, Lion bir BEL fırlatıldığında küçük bildirim rozetleri ekledi. Bunu şu komutla kendin atabilirsin:

tput bel

Yani, arka planda bazı işler yapıyorsanız ve bittiğinde bildirim almak istiyorsanız, şöyle bir şey deneyebilirsiniz:

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

Bu, ping komutunu arka plan görevi olarak çalıştırır (asılı ve bunu gerçekleştirir) ve tamamlandığında basit bir uyarı verir. Tarihsel olarak BEL, [korkunç] donanım bip sesini yapmak için kullanıldı, ancak Lion, "geçersiz komut" ses efekti, bir bildirim rozeti ve iskelede iki kez zıplayan terminal simgesi ile zevkle değiştirdi.


1
printf '\a'eşdeğer olurdu tput bel. Uyarıya neden olan sekme şu anda etkinse, Terminal'in Dock simgesini zıplamadığını unutmayın.
Lri

5

Bu cevabı iki şey olarak sunuyoruz:

  • Bildirim için afplayses dosyalarını çalan , kullanma seçeneği .
  • Çıkış durumumu bildirimle birlikte raporlama araçlarım .

Bu senaryo bende ~/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

Argümanın 0 olup olmadığına bağlı olarak farklı bir ses çıkar. Sonra bir takma adım var:

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

(Aynı ada sahip olduklarının önemi yoktur ve muhtemelen kötü bir fikirdir.)

Örneğinizde kullanmak için svn update . && ant clean build start; donebeep,. Beni ;değil de kullandığımı &&, böylelikle başarısızlık ve başarı hakkında beni bilgilendirebileceklerini unutmayın.

Önce ben öğrendimafplay , kullandığım sayyerine iletileri caizse. Rolü donebeepbu senaryo ile oynandı:

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

Bu komut dosyası iki farklı mesaj almak yerine doğrudan çıkış kodunu söyler. Ayrıca, geçerli dizinin adını da belirtir (hangi görevin yapıldığını netleştirmek için) ve parametreleri diğer adaya geçirerek söylenebilecek ek metinler (diğer adın "$@"içinde bu yüzden var) verilebilir . İzi not edin, &böylece bir bilgi istemi almadan konuşmanın bitmesini beklemenize gerek kalmaz.


İçin man sayfasıafplay eksik; afplay -htüm seçenekleri listeler:

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

Ayrıca build in say komutunu bildirim için de kullanabilirsiniz, örneğin: "ant: build: done" deyin. Bakın: adam terminalde söyle.



1

ntfyBu amaçla yazdım . Öyle çapraz platform ve edebilirsiniz otomatik uzun çalışan komutları bittiğinde bildirim gönderebilir.

Python'a sahipseniz pip(çoğu Linux dağıtımı ve MacOS'ta bulunur), nasıl yükleneceği ve otomatik bildirimlerin etkinleştirildiği yer:

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

Http://ntfy.rtfd.io adresinden kontrol edin.

Buna ek olarak, şunları da yapabilir:

  • terminal ön plandayken otomatik bildirimleri bastır (X11, iTerm2 ve Terminal.app varsayılan olarak desteklenir ve etkinleştirilir)
  • bulut tabanlı bildirimler gönderin (Pushover, Pushbullet ve XMPP)
  • Bir işlem sona erdiğinde bildirim göndermek için kullanılır (yukarıda belirtilen otomatik destek değil)
  • manuel olarak bildirim gönder (komut dosyalarında kullanım için iyi!)

1

iTerm2 bildirim almak için yerleşik bir mekanizmaya sahiptir, ancak Shell Integration programını kurmanız gerekir .

Uzun süren bir komutu başlattığınızda, şunları seçin:
Düzen> İşaretler ve Açıklamalar> Uyarılar> Bir sonraki işarette uyarı ( ⌥Option+ ⌘Command+ A)

Komut istemi döndüğünde aşağıdakilerden birini seçebilirsiniz:

  • Kalıcı Uyarı Kutusunu Göster
  • Bildirim Sonrası (örnek ekran görüntüsü)


0

Ubuntu, şu takma adı ~ / .bashrc biçiminde gönderir:

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$//'\'')"'

Bununla, daha sonra gibi şeyler yapabilirsiniz:

make; alert
sleep 10; alert

Belki notify-sendMac OSX’de eşdeğeri vardır ? Mac ve Ubuntu'da da benzer açılır pencereleri gördüm.


Apple sitesindesiniz. Bunu bir cevap haline getirmek için, lütfen notify-sendMac OS X'te nasıl edineceğinizi açıklayın .
Daniel Beck,

4
Bunun bir nevi uygunsuz olduğu konusunda hemfikirim, ama aslında bunu faydalı buldum. Bu soruya Google’dan geldim ve orijinal sorum Mac’e özgü değildi. Orijinal poster gibi, uzun zaman alan bir komut çalıştırırken terminalimi izlememe gerek yok; Sadece Ubuntu'yu kullanıyorum: /
allyourcode

0

Sesler ve modal pencerelerdeki sorunum nereden geldiklerini söyleyemem. Şu anda bir sürü boşlukla ve bazen de 20 terminal penceresinin üzerinde çalışıyorum.

Benim çözümüm unix tarafına taşınabilir ve ansi kaçış dizilerini destekleyen herhangi bir şeyle çalışmalıdır. Bu çözüm Snow Leopard ile birlikte çalışır ve muhtemelen terminalin daha eski sürümleriyle çalışır.

.Bash_profile içindeki tek satır

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

Bunu yıkmak:

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

Kırmızıyı sevmiyorsanız, google ascii kaçış kodları arka plan rengini google. Bunun tüm ekranı kırmızıya değiştirmediğini, ancak komut bittikten sonra çıkacak her şeyi değiştirdiğini unutmayın.


0

Buradaki sorunu çözmek için bir senaryo hazırladım . Bunun için fazladan bir yazılıma ihtiyacınız yok. Kurulum:
brew install akashaggarwal7/tools/tsay
kullanım:
sleep 5; tsay

Katkıda bulunmaktan çekinmeyin!


Oy kullanma sebebi?
Akash Agarwal

0

İşte benim bash fonksiyonum (sadece ~/.bashrcveya herhangi bir yere koyun ~/.zshrc:

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

Kullanmak için: watch echo 'hi there'

Ayrıca bildirim sesini burada belgelenen şekilde özelleştirebilirsiniz: https://apple.stackexchange.com/a/115373/9622


0

Her zaman böyle şeyler yapıyorum. Komut satırım benziyor olabilir

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

Eğer bin/setupve bundle installbaşarıyla tamamlamak komutları, ben sistemi / dikte ses "Tümü bitti" demek duyarsınız. İlk iki hatanın biri çıkarsa, &&zincir takip edilmeyecek ve duyduğum tek şey "Tamam" dır.


0

osascriptBir bildirim gösteren bir Apple Script'i çalıştırmak için yerleşik komutu kullanabilirsiniz, örn.

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

Örneğin, basit bir noktalı virgül ile bağlayabilirsiniz.

your-command ; osascript -e '....'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.