Saya ingin memiliki pemberitahuan desktop setiap kali perintah yang telah berjalan lebih dari, katakanlah 15 detik, selesai dalam shell interaktif.
Dengan kata lain, saya ingin semua perintah dibungkus dengan sesuatu seperti ini
start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"
Apa cara terbaik untuk mencapai ini di bash?
bash
notification
aioobe
sumber
sumber
Jawaban:
Anda ingin https://launchpad.net/undistract-me (dapat diinstal dari arsip Ubuntu dengan
sudo apt-get install undistract-me
) yang melakukan persis apa yang Anda minta, termasuk bekerja secara otomatis (yaitu, tanpa harus ingat untuk menambahkan sesuatu yang ekstra untuk berpotensi lama- menjalankan perintah).sumber
sleep 30
, tetapi tidak ada pemberitahuan..bashrc
:. /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install
. Tampaknya menjadi bug: github.com/jml/undistract-me/issues/23Sejauh yang saya mengerti Anda ingin bungkusnya . Dan Anda ingin menggunakan perintah melalui itu sehingga akan memberi Anda pemberitahuan yang diinginkan jika waktu menjalankan perintah Anda lebih dari 15 detik. Jadi ini dia.
Salin fungsi ini di
~/.bashrc
dan sumber Anda~/.bashrc
sebagai,Penggunaan
Jika dibutuhkan lebih dari 15 detik, Anda akan mendapatkan pemberitahuan desktop yang menggambarkan perintah dan waktu eksekusi.
Contoh
sumber
"$@"
, Tidak$@
. Perbedaan besar.wrapper
di depan setiap perintah yang saya ketik.command; alert
sebenarnya lebih pendek dariwrapper command
:-)notify-send
kadaluwarsa untuk waktu yang lama, maka beri tahu-kirim batas waktu khusus (dalam milidetik). misalnyanotify-send --expire-time 999999999 ...
Di
~/.bashrc
sana ada alias yangalert
didefinisikan sebagai:yang dapat digunakan untuk memberi tahu penyelesaian eksekusi perintah.
Pemakaian:
misalnya
Anda dapat menyesuaikan alias sesuai kebutuhan dan keinginan Anda.
sumber
Terlepas dari pembungkus seperti yang disarankan souravc, sebenarnya tidak ada cara yang baik untuk melakukan ini di bash. Anda dapat meretasnya dengan perangkap DEBUG dan PROMPT_COMMAND. Perangkap DEBUG dipicu setiap kali Anda menjalankan perintah, dan PROMPT_COMMAND dijalankan tepat sebelum prompt ditulis.
Jadi barang untuk
~/.bashrc
menjadi sesuatu sepertiIni adalah retasan, jadi jangan heran jika Anda menemukan efek samping aneh dengan ini.
sumber
SUNTING
TL; DR : buat pintasan pelengkapan otomatis
.inputrc
dan fungsikan dalam.bashrc
. Jalankan perintah seperti biasa, ketikkan, tetapi alih-alih ENTER, tekan pintasan yang Anda tentukan.inputrc
Orang yang memberi hadiah pada pertanyaan ini mengatakan:
Saat meneliti solusi untuk masalah ini, saya menemukan pertanyaan ini dari stackexchange, yang memungkinkan pengikatan CtrlJke urutan perintah: Ctrla(pindah ke awal baris), tempatkan string "mesure" di depan perintah yang Anda masukkan, Ctrlm(jalankan)
Dengan demikian Anda mendapatkan fungsionalitas penyelesaian otomatis dan ENTERperintah terpisah untuk mengukur waktu, sambil mempertahankan tujuan asli dari fungsi kedua yang saya posting di bawah ini.
Sampai sekarang, berikut adalah isi
~/.inputrc
file saya :"\C-j": "\C-a measure \C-m"
Dan di sini adalah isi dari
.bashrc
(catatan, saya belum pernah menggunakan bash selamanya - Saya menggunakan mksh sebagai shell saya, maka itulah yang Anda lihat di posting asli. Fungsionalitasnya masih sama)Pos Asli
Inilah ide saya - gunakan fungsi dalam
.bashrc
. Prinsip dasar - gunakan/usr/bin/time
untuk mengukur waktu yang dibutuhkan untuk menyelesaikan perintah, dan jika lebih dari 15 detik, kirim pemberitahuan.Di sini saya mengarahkan output ke
/dev/null
tetapi untuk melihat output, mengarahkan ke file juga dapat dilakukan.Pendekatan yang jauh lebih baik, IMHO, adalah mengirim output waktu ke beberapa file di folder rumah Anda (supaya Anda tidak mencemari sistem Anda dengan timefiles, dan selalu tahu ke mana harus mencari). Ini versi kedua
Dan inilah screenshot dari versi pertama dan kedua, dalam urutan itu
Versi pertama, tidak ada output
Versi kedua, dengan output
sumber
sudo lsof
dan sebagian besar denganping -c20 google.com
.Baru-baru ini saya membangun alat yang melayani tujuan ini. Ini dapat dijalankan sebagai pembungkus atau secara otomatis dengan integrasi shell. Lihat di sini: http://ntfy.rtfd.io
Untuk menginstalnya:
Untuk menggunakannya sebagai pembungkus:
Untuk mendapatkan notifikasi secara otomatis, tambahkan ini ke Anda
.bashrc
atau.zshrc
:sumber
Script Anda berfungsi dengan baik, pastikan Anda menyertakan baris 'shebang' (
#!/bin/bash
) . Yang lain#!/bin/bash
disebutkan di sini , tetapi sebagian besar waktu,#!/bin/bash
berfungsi dengan baik untuk skrip bash Unix. Ini diperlukan oleh penerjemah skrip sehingga ia tahu jenis skrip apa itu.Ini tampaknya berfungsi sebagai skrip pengujian:
Untuk memodifikasi skrip ini, letakkan perintah di mana
echo
dansleep
baris berada.Catatan dengan
notify-send
, Anda dapat menggunakan-i
untuk menentukan ikon juga :-)Juga, pastikan itu dapat dieksekusi dengan menjalankannya
chmod +x /PATH/TO/FILE
terlebih dahulu.sumber
Anda dapat memodifikasi Bash untuk mengimplementasikan fungsionalitas pembungkus yang Anda inginkan.
Jika Anda cenderung melakukan banyak modifikasi pada shell interaktif Anda, Anda dapat mempertimbangkan untuk beralih ke shell yang secara intrinsik dapat diretas seperti eshell, yang dibangun menggunakan elac Emacs dan memiliki semua kemampuan penyesuaian bertingkat:
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
sumber
Anda juga dapat melakukan ini dengan pernyataan sederhana jika seperti ini
Anda dapat menggunakan nama variabel Anda sendiri.
Saya dapat mengkonfirmasi bahwa ini berfungsi, saya diuji dengan perintah yang membutuhkan waktu lama untuk menyelesaikan dan yang tidak dan pemberitahuan datang untuk yang membutuhkan waktu lama
Anda juga dapat melakukan ini dengan perintah apapun dengan mengganti
ORIGINAL_COMMAND
dengan$@
dan menjalankan script sebagai./script command
.sumber
$((2+2))
adalah bash builtin, tidak memerlukan program tambahan. Ketiga: tidak bekerja dengan perintah yang memiliki spasi. tl; dr: lebih buruk daripada jawaban lain yang berumur 1 tahun