Growl Notification untuk Penyelesaian Tugas Shell

12

(Khusus OSX)

Saya, seperti banyak orang lain selain saya sendiri sering menemukan diri saya memulai proses di shell yang membutuhkan satu atau dua menit untuk menyelesaikan (contoh komit besar misalnya). Selama waktu itu, saya sering alt-tab dan menyegarkan reddit / slashdot / wikipedia / apa pun. Akan lebih baik jika ada sesuatu yang diatur yang memposting pemberitahuan growl ketika proses shell selesai.

Di dunia ideal saya, ini akan bekerja seperti ini: "Jika suatu proses baru saja keluar dari tab yang terbuka di Terminal, posting pemberitahuan growl."

Adakah yang memiliki pengaturan seperti ini?

ezrock
sumber
1
Perhatikan bahwa growl hanya akan memberi tahu Anda jika Anda masih duduk di layar. Untuk program yang lebih lama, gunakan perintah "katakan" untuk mendapatkan petunjuk audio bahwa itu sudah selesai.
@mankoff: Anda dapat mengonfigurasi growlnotifypengaturan pemberitahuan aplikasi Growl.prefPaneuntuk memasukkan suara notifikasi audio. Namun, itu tidak dapat diubah tergantung pada perintah yang Anda jalankan, seperti yang sayakan terjadi. Tapi itu jauh lebih menyeramkan.
Daniel Beck

Jawaban:

11

Anda dapat menginstal growlnotify untuk melakukan ini.

$ ./some_program && growlnotify Title -m Message

Tentu saja Anda perlu memikirkan ini sebelum melakukan perintah Anda. Alternatifnya (saya tidak tahu bagaimana mencapai ini) akan menjadi pemberitahuan Growl untuk setiap perintah, yang akan sangat mengganggu.


Untuk menyederhanakan penggunaan growlnotify untuk use case Anda, edit ~/bash_profiledan tambahkan berikut ini:

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

sekarang Anda bisa long your_command(mirip dengan sudo). Ctrl-Aposisi kursor di awal baris, jika Anda (seperti saya) selalu mengetikkan perintah yang sebenarnya terlebih dahulu dan perlu menambahkan awalan sesudahnya.

Sayangnya bash-fu saya tidak cukup untuk dapat menambahkan perintah ke growlnotifypesan


per komentar @ mankoff untuk jawaban ini:

Anda cukup mengetik saat perintah sedang berjalan, dieksekusi setelah itu. Saya membuat fungsi berikut untuk saya:

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

Gunakan sebagai gn svn.

Daniel Beck
sumber
2
Anda tidak perlu memikirkannya sebelum perintah. Jika, ketika sedang berjalan, Anda menyadari bahwa Anda ingin diberi tahu ketika selesai, cukup ketik "gn foo" (atau "say done", untuk petunjuk audio), tekan enter, dan perintah itu akan berjalan ketika yang sekarang selesai .
Apakah Anda berkomentar untuk melakukan ini secara otomatis ... Gunakan PS1 atau sesuatu untuk menyentuh stempel waktu. Gunakan PS2 untuk memverifikasi berapa lama sejak PS1 menyentuhnya. Jika sudah> n detik, maka jalankan growlnotify. Sekarang tidak mengganggu karena tidak terjadi untuk setiap perintah.
@mankoff Benar. Jadi fungsi sederhana untuk mengurangi pengetikan sudah cukup.
Daniel Beck
@mankoff PS2? Bukankah ini hanya kelanjutan prompt? Itu tidak awalan setiap jalur output ..?
Daniel Beck
PS1 / PS2 hanyalah tebakan sebagai tempat saya mulai mencari jika saya ingin menerapkan ini. Mungkin semuanya bisa disematkan hanya dalam PS1. Dan mungkin ada cara yang sama sekali berbeda untuk membuat pengaturan growl-for-every-command umum.
2

Yang Anda butuhkan adalah growlnotifyprogram CLI untuk memicu notifikasi growl. Anda bisa menggunakannya sebagai:

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

Ini memiliki beberapa tombol yang dapat Anda mainkan, gunakan growlnotify -huntuk info lebih lanjut

roguesys
sumber
Terima kasih. Saya hanya berkomentar pada saat yang sama ketika saya menemukan itu juga. Titik koma lebih masuk akal daripada && juga.
ezrock
1
@ezrock Saya pikir seseorang dapat menggunakan &&dan ||memiliki pesan yang berbeda antara status keberhasilan dan kegagalan, tetapi jika seseorang hanya tertarik pada pesan yang ditampilkan setelah perintah dijalankan, maka ;;sangat mudah. =)
roguesys
2

Memodifikasi jawaban Daniel Beck jika Anda melakukan sedikit perubahan ini membuatnya sangat menyenangkan.

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

Kemudian ketika Anda menjalankan 'long svn up' Anda akan melihat pesan 'svn up selesai.'

Sangat bagus jika Anda menjalankan banyak skrip shell yang memakan waktu secara bersamaan.

bmucklow
sumber
2

Sekarang OSX 10.8 dan yang lebih baru memiliki notifikasi asli, inilah cara saya mencapai tujuan yang sama melalui terminal-notifier :

  1. Pasang brew
  2. $ brew install terminal-notifier
  3. Tambahkan ini ke ~/.bash_profile:

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

Pastikan bahwa Anda telah menggunakan profil Anda . ~/.bash_profile(tidak perlu untuk sesi terminal di masa mendatang), karena profil Anda bersumber secara otomatis saat membuat sesi.

Uji dengan perintah favorit Anda, diikuti dengan panggilan fungsi.

ls ; gn

Argumen untuk terminal-notifier dapat bertahan beberapa perbaikan, tetapi upaya cepat meraih perintah sebelumnya untuk lulus ke fungsi tidak berhasil dan ini membuat saya semua fungsi yang saya butuhkan. Yaitu, menambahkan ;gnuntuk mendapatkan pemberitahuan di akhir dari proses yang berjalan lama.

ezrock
sumber
1

Ini adalah cara untuk mengaktifkannya secara otomatis untuk proses "berjalan lama": http://hints.macworld.com/article.php?story=20071009124425468

Ini menghubungkan ke $PROMPT_COMMANDdan memberitahukan penyelesaian proses yang membutuhkan waktu lebih dari 10 detik untuk menyelesaikannya. Anda mungkin perlu menyesuaikannya agar sesuai dengan lingkungan dan alur kerja Anda sendiri (misalnya, mengabaikan penyelesaian lessatau permohonan editor), tetapi tampaknya berhasil dengan baik di luar kotak.

Kristian Domagala
sumber
Saya belum mencobanya sendiri, tetapi pendekatan yang sepenuhnya otomatis terdengar sangat menarik. Semua solusi lain di sini memerlukan pengetahuan sebelumnya bahwa perintah akan berjalan lama dan mengingat untuk memicu skrip (mis. Ls; growlnotify). Saya suka ide tidak perlu memicunya secara manual.
ezrock
0

Saya hanya mencari-cari lagi dan menemukan metode sederhana untuk ini. Ini sedikit lebih manual daripada yang saya inginkan, tapi begini saja.

  1. Instal growlnotify (Ada di folder ekstra unduhan instalasi Growl) 1.
  2. Menambahkan < && growlnotify -m "Message"> ke proses yang panjang.

Itu bekerja untuk saya sekarang, tetapi saya bisa melakukan yang lebih baik, metinks.

ezrock
sumber
0

Solusi OSX 10.9+ tanpa perangkat lunak pihak ketiga:

Di OSX 10.9 dan di atasnya, Anda dapat menggunakan perintah AppleScript display notificationuntuk menampilkan growl dari terminal seperti:

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

Jika Anda tidak ingin mengetik semua itu setiap saat, Anda dapat menggunakan alias:

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

Contoh:

long-running-script.sh; growl
stiemannkj1
sumber