Cara mendapatkan notifikasi ketika perintah saya selesai

60

Saya menjalankan serangkaian perintah pada baris perintah yang membutuhkan waktu sekitar dua puluh menit untuk menyelesaikannya. Saya ingin melihat semacam pemberitahuan pada Mac saya ketika ini selesai jadi saya tidak perlu memonitor terminal ketika selesai. Apakah ada cara untuk melakukan ini?

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

Edit :

Saya bisa menggunakan xclocktetapi ini sepertinya hack. Idealnya saya bisa mengirim notifikasi ke mana saja, seperti ponsel, layar, dll.

Amir Afghani
sumber
2
Meskipun Anda berada di baris perintah, saya pikir jawabannya di sini sebenarnya khusus untuk Mac dan tidak terkait Unix / Linux. Itu karena saya pikir Anda mungkin ingin menggunakan Growl dan grownlnotify.
Itu bukan perintah build, setidaknya di kotak saya.
growl.info Growl adalah program yang dirujuk oleh @mattdm.
jsbillings

Jawaban:

57

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

Eugene Bujak
sumber
1
Ini adalah contoh yang bagus menggunakan operator shell &&untuk menyatukan beberapa perintah dan membungkusnya dengan kolektif ||atau pernyataan untuk meningkatkan kesalahan. +1 memang
bmike
2
Bagus! Untuk dapat melakukan itu dengan cepat meskipun, saya menyerah error vs informasi keberhasilan dan menambahkan alias global untuk zsh saya: alias -g sd='; say done'. Ini berarti saya hanya perlu menambahkan sdperintah apa pun, dan saya akan diberi tahu.
wrtsprt
bagus dan sekarang saya memiliki sesuatu untuk dimainkan
Marco Prins
Sudah dicoba dan dilakukan sekaligus kesalahan selalu dikatakan :( Contoh:(echo alik && echo Orly && say done) || say error
AlikElzin-kilaka
1
Sangat berguna. Saya telah bergema dengan say -v Zarvoxyang membuat semua orang di sekitarnya melompat, ini adalah pemberitahuan yang sedikit kurang mengkhawatirkan.
Siddhartha
49

Di Mac OS 10.8 Anda dapat mengirim sendiri pesan Pusat Pemberitahuan (mirip dengan Growl tetapi terintegrasi ke Mac OS).

Lihat " Kirim Peringatan ke Pusat Pemberitahuan dari Baris Perintah di OS X " untuk melihat cara memasang permata Ruby yang memungkinkan Anda mengirim pemberitahuan dari baris perintah. Untuk menyederhanakan kasus penggunaan umum hanya peduli tentang fakta sesuatu di terminal sedang dilakukan, tambahkan alias ke .bash_profile Anda:

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

Maka Anda cukup melakukan:

$ <long-running task> ; notifyDone

Setelah tugas jangka panjang selesai, Anda akan mendapatkan modal popup bagus yang bertahan hingga Anda mengkliknya:

Munculan Pusat Pemberitahuan

Tom Crockett
sumber
9
terminal-notifier dapat diinstal melalui homebrew , juga: brew install terminal-notifier. Maka Anda bisa menulis myCommand && terminal-notifier -message 'finished'. Diuji pada OS X Yosemite (10.10.1).
Pwdr
4
Anda harus menjalankan myCommand; terminal-notifier -message 'finished'jika tidak, notifikasi tidak akan ditampilkan jika myCommandgagal.
aheuermann
Solusi yang luar biasa! Omong-omong, ini tidak menghasilkan suara seperti notifikasi OS X lainnya. Ada solusi untuk itu?
SexyBeast
@Cupidvogel Anda bisa menambahkan sayperintah, misalnya my command ; terminal-notifier -message 'finished' ; say finished
Tom Crockett
1
Berbagai jawaban untuk pertanyaan ini memberikan banyak detail lebih lanjut: apple.stackexchange.com/questions/57412/...
Joshua Goldberg
20

Gunakan Growl .

Dalam .dmgfile, cari tambahan, ada biner growlnotify. Instal, seperti di /usr/local/bin. Maka Anda dapat menggunakan perintah ini

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

untuk menampilkan popup, seperti itu:

menggeram

Loïc Wolff
sumber
2
Saya menggunakan hampir pendekatan yang tepat ini tetapi saya memperluas Growl dengan Prowl sehingga Growl dapat mendorong notifikasi ke iPhone saya.
Ian C.
3
Pusat Pemberitahuan Mountain Lion membuat Growl tidak perlu ... lihat jawaban saya untuk bagaimana menggunakannya untuk ini.
Tom Crockett
16

Pada Mac OS X Lion 10.7, Terminal memiliki beberapa indikator status baru untuk membantu dengan masalah seperti ini:

Di tab:

  • Aktivitas: indikator aktivitas (indikator progres pemintalan) ditampilkan ketika ada keluaran terkini ke terminal. Ini memungkinkan Anda untuk melihat apakah saat ini sibuk atau telah menyelesaikan proses yang panjang. (Atau, tentu saja, Anda dapat menggunakannya untuk mengetahui kapan ia mulai menghasilkan output setelah bekerja diam-diam untuk sementara waktu.)

  • Belum dibaca: ellipsis "..." ditampilkan untuk menunjukkan teks baru dan belum dibaca di tab latar belakang. Ketika Anda memilih tab, indikator dihapus.

  • Peringatan: "bel" ditampilkan untuk menunjukkan kapan BEL telah ditulis ke tab latar belakang atau jendela latar belakang. Selain itu, Terminal menampilkan lencana merah pada ikon aplikasi, yang menunjukkan jumlah peringatan / lonceng "belum dibaca" di semua terminal. Jika Terminal itu sendiri di latar belakang, itu juga memantul ikon Dock-nya ketika bel dimainkan.

Di jendela diperkecil ikon Dock:

  • Aktivitas: aktivitas ditunjukkan dengan menampilkan nama proses latar depan.

  • Belum dibaca: teks yang belum dibaca ditandai dengan elipsis.

  • Jendela terminal yang diperkecil menampilkan konten langsung dalam ikon Dock mereka. Ini dapat digunakan untuk melihat apakah ada aktivitas, atau bahkan untuk menentukan apa yang dilakukan terminal, jika output yang Anda cari dapat diidentifikasi (misalnya, tampilan "atas" cukup mudah dikenali bahkan pada ukuran kecil). Ini sangat berguna ketika perbesaran Dock dihidupkan atau Anda memiliki ruang untuk Dock besar.

Selain itu, Anda dapat menampilkan sesuatu di terminal untuk menarik perhatian Anda (yang akan terlihat bahkan di jendela yang diperkecil). Sebagai contoh:

  • Tampilkan tanda bintang besar: banner \*

  • Balikkan tampilan: printf '\e[?5h'

  • Warnai layar merah: tput setab 1; tput clear

  • Duduk dalam satu lingkaran, berkedip layar: while true; do printf '\e[?5h'; sleep 1; printf '\e[?5l'; sleep 1; done

Ada juga kode pelarian untuk memanipulasi windows (memindahkan, mengatur ukuran, memperbesar, memperkecil, dll.). Anda dapat memperbesar jendela Terminal, misalnya:

printf '\e[9;1t'

Lihat "manipulasi jendela" di http://invisible-island.net/xterm/ctlseqs/ctlseqs.html untuk detailnya.

Pendekatan lain adalah dengan menggunakan AppleScript untuk menampilkan peringatan di jendela terpisah:

osascript -e 'tell app "System Events" to display alert "Build Completed" message "The checkout and build have completed."'
Chris Page
sumber
Sangat baik menggunakan tput, dan melarikan diri dari urutan - Anda memiliki segalanya kecuali pesan gulir di bilah judul!
bmike
11

Saya tahu saya terlambat ke pertanyaan tapi saya pikir ada bagian yang hilang yang mungkin membantu. Saya telah menemukan bahwa, meskipun rapi, membuat terminal Anda berbicara dengan Anda tidak sepenuhnya berfungsi. Apa yang lebih baik adalah sesuatu yang lebih subtil seperti ini:

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

Seperti yang ditunjukkan Chris, Lion telah menambahkan sedikit lencana pemberitahuan ketika BEL dilemparkan. Anda dapat membuangnya sendiri dengan perintah:

tput bel

Jadi, jika Anda melakukan beberapa pekerjaan di latar belakang dan ingin pemberitahuan ketika selesai Anda dapat mencoba sesuatu seperti:

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

Ini menjalankan perintah ping sebagai tugas latar belakang (penggantungan & menyelesaikan ini) dan meminta peringatan sederhana ketika selesai. Secara historis BEL telah digunakan untuk membuat bunyi bip perangkat keras [yang mengerikan] itu, namun Lion dengan penuh selera menggantikannya dengan efek suara "perintah tidak sah", lencana pemberitahuan, dan ikon terminal memantul dua kali di dermaga.

Austin Lucas
sumber
1
printf '\a'akan setara dengan tput bel. Perhatikan bahwa Terminal tidak memantulkan ikon Dock jika tab yang menyebabkan peringatan saat ini aktif.
Lri
4

Anda juga bisa menggunakan perintah build in say untuk notifikasi, mis .: say "ant: build: done." Lihat: kata orang di terminal.

mst
sumber
4

Saya hadir dalam jawaban ini dua hal:

  • Opsi penggunaan afplay, yang memutar file suara , untuk notifikasi.
  • alat saya untuk melaporkan status keluar bersama dengan notifikasi.

Saya memiliki script ini, ~/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

Ini memainkan suara yang berbeda tergantung pada apakah argumennya adalah 0. Lalu saya memiliki alias:

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

(Bahwa mereka memiliki nama yang sama tidak relevan dan mungkin ide yang buruk.)

Untuk menggunakannya dalam contoh Anda svn update . && ant clean build start; donebeep,. Perhatikan bahwa saya menggunakan ;daripada &&, sehingga dapat memberi tahu saya tentang kegagalan serta kesuksesan.

Sebelum saya pelajariafplay , saya biasa sayberbicara pesan. Peran donebeepdimainkan oleh skrip ini:

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

Skrip ini berbicara kode keluar secara langsung alih-alih memiliki dua pesan berbeda. Itu juga menyebutkan nama direktori saat ini (untuk membantu memperjelas tugas mana yang dilakukan), dan dapat diberikan teks tambahan untuk mengatakan dengan meneruskan parameter ke alias (itu sebabnya alias ada "$@"di dalamnya). Catat trailing &sehingga Anda tidak perlu menunggu pidato selesai sebelum mendapatkan prompt.


The man page untukafplay tidak lengkap; afplay -hdaftar semua opsi:

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
sumber
1

Saya menulis ntfyuntuk tujuan ini. Ini adalah lintas platform dan secara otomatis dapat mengirim notifikasi ketika perintah yang berjalan lama selesai.

Jika Anda memiliki Python pip(kebanyakan distro Linux dan MacOS memilikinya), berikut ini cara menginstalnya dan mengaktifkan pemberitahuan otomatis:

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

Lihat di http://ntfy.rtfd.io

Selain itu, ia juga dapat:

  • Menekan pemberitahuan otomatis ketika terminal di latar depan (X11, iTerm2 & Terminal.app didukung dan diaktifkan secara default)
  • mengirim pemberitahuan berbasis cloud (Pushover, Pushbullet, dan XMPP)
  • digunakan untuk mengirim pemberitahuan ketika suatu proses berakhir (bukan dukungan otomatis yang disebutkan di atas)
  • mengirim pemberitahuan secara manual (baik untuk digunakan dalam skrip!)
Daniel Schep
sumber
0

Ubuntu mengirim alias berikut ini di ~ / .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$//'\'')"'

Dengan ini, Anda kemudian dapat melakukan hal-hal seperti:

make; alert
sleep 10; alert

Mungkin ada yang setara dengan notify-senddi Mac OSX? Saya telah melihat popup Windows serupa di Mac dan Ubuntu.

Dustin Kirkland
sumber
Anda berada di situs Apple. Untuk membuat ini menjadi jawaban, tolong jelaskan bagaimana cara mendapatkan notify-senddi Mac OS X.
Daniel Beck
4
Saya setuju bahwa ini agak tidak pantas, tetapi saya benar-benar menemukan ini membantu. Saya sampai pada pertanyaan ini dari Google, dan pertanyaan awal saya tidak spesifik untuk Mac. Seperti poster aslinya, saya ingin cara untuk tidak harus memonitor terminal saya ketika menjalankan perintah yang membutuhkan waktu lama; Saya kebetulan menggunakan Ubuntu: /
allyourcode
0

Masalah saya dengan suara dan modal windows adalah saya tidak tahu dari mana mereka berasal. Saat ini saya bekerja dengan banyak ruang, dan kadang-kadang lebih dari 20 jendela terminal.

Solusi saya portabel untuk sisi unix, dan harus bekerja dengan apa pun yang mendukung urutan pelarian ansi. Solusi ini bekerja dengan Snow Leopard, dan mungkin akan bekerja dengan versi terminal yang lebih kuno.

Baris tunggal di .bash_profile

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

Hancurkan itu:

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

Jika Anda tidak suka merah, google ascii escape kode warna latar belakang. Perhatikan bahwa ini tidak mengubah seluruh layar merah, tetapi hanya output apa pun setelah perintah selesai.

Sherwood Botsford
sumber
0

Saya membuat skrip untuk menyelesaikan ini yang ada di sini . Anda tidak memerlukan perangkat lunak tambahan untuk ini. Instalasi:
brew install akashaggarwal7/tools/tsay
Penggunaan:
sleep 5; tsay

Silakan berkontribusi!

Akash Agarwal
sumber
Alasan downvote?
Akash Agarwal
0

Inilah fungsi bash saya (cukup taruh di mana saja di Anda ~/.bashrcatau ~/.zshrc:

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

Untuk menggunakannya: watch echo 'hi there'

Anda juga dapat menyesuaikan suara notifikasi seperti yang didokumentasikan di sini: https://apple.stackexchange.com/a/115373/9622

Randomor
sumber
0

Saya melakukan hal semacam itu sepanjang waktu. Baris perintah saya mungkin terlihat seperti

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

Jika bin/setupdan bundle installperintah selesai dengan sukses, saya akan mendengar suara sistem / dikte mengatakan "Semua selesai". Jika salah satu dari dua kesalahan pertama keluar, maka &&rantai tidak akan diikuti, dan yang akan saya dengar adalah "Selesai".

Jeff Dickey
sumber
0

Anda dapat menggunakan osascriptperintah bawaan untuk menjalankan Apple Script yang menampilkan pemberitahuan, misalnya

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

Anda dapat merangkai bersama-sama dengan titik koma sederhana, misalnya

your-command ; osascript -e '....'
jchook
sumber