Chcę otrzymywać powiadomienie na pulpicie za każdym razem, gdy polecenie uruchamiane przez ponad, powiedzmy 15 sekund, kończy się w interaktywnej powłoce.
Innymi słowy, chciałbym, aby wszystkie polecenia były zapakowane w coś takiego
start=$(date +%s);
ORIGINAL_COMMAND;
[ $(($(date +%s) - start)) -le 15 ] || notify-send "Long running command finished"
Jaki jest najlepszy sposób na osiągnięcie tego w bash?
bash
notification
aioobe
źródło
źródło
Odpowiedzi:
Chcesz https://launchpad.net/undistract-me (instalowalny z archiwów Ubuntu za pomocą
sudo apt-get install undistract-me
), który robi dokładnie to, o co prosisz, w tym działa automatycznie (to znaczy, bez konieczności dodawania czegoś dodatkowego do potencjalnie długich- uruchamianie poleceń).źródło
sleep 30
, ale bez powiadomienia..bashrc
:. /usr/share/undistract-me/long-running.bash
notify_when_long_running_commands_finish_install
. Wydaje się, że to błąd: github.com/jml/undistract-me/issues/23O ile rozumiem, chcesz opakowanie . I chcesz użyć polecenia za jego pośrednictwem, aby dało pożądane powiadomienie, jeśli czas działania polecenia jest dłuższy niż 15 sekund. Więc oto to.
Skopiuj tę funkcję do swojego
~/.bashrc
i źródła~/.bashrc
jako,Wykorzystanie
Jeśli zajmie to więcej niż 15 sekund, otrzymasz powiadomienie na pulpicie opisujące polecenie i czas jego wykonania.
Przykład
źródło
"$@"
Nie$@
. Duża różnica.wrapper
przed każdym poleceniem, które wpisuję.command; alert
jest w rzeczywistości krótszy niżwrapper command
:-)notify-send
aby wygasł przez długi czas, podaj powiadomienie-wyślij niestandardowy limit czasu (w milisekundach). np.notify-send --expire-time 999999999 ...
W
~/.bashrc
jest aliasalert
określono jako:które mogą być użyte do powiadomienia o zakończeniu wykonywania polecenia.
Stosowanie:
na przykład
Możesz dostosować alias do swoich potrzeb i pragnień.
źródło
Oprócz sugerowanego opakowania takiego jak souravc, naprawdę nie ma dobrego sposobu na zrobienie tego w bashu. Możesz włamać się do niego z pułapką DEBUG i PROMPT_COMMAND. Pułapka DEBUG jest uruchamiana przy każdym uruchomieniu polecenia, a PROMPT_COMMAND jest uruchamiany tuż przed napisaniem monitu.
Rzeczy
~/.bashrc
stają się czymś takimTo jest hack, więc nie zdziw się, jeśli spotkasz się z dziwnymi efektami ubocznymi.
źródło
EDYTOWAĆ
TL; DR : utwórz skrót do autouzupełniania
.inputrc
i uruchom w.bashrc
. Uruchom polecenie jak zwykle, wpisz, ale zamiast tego ENTERnaciśnij skrót określony w.inputrc
Osoba, która naliczyła nagrodę za to pytanie, powiedziała:
Badając rozwiązania tego problemu, natknąłem się na to pytanie z stackexchange, które pozwala na powiązanie CtrlJz sekwencją poleceń: Ctrla(przejście do początku linii), umieść ciąg „mesure” przed wprowadzonym poleceniem, Ctrlm(wykonaj)
W ten sposób otrzymujesz funkcję automatycznego uzupełniania i osobne ENTERpolecenie do pomiaru czasu, zachowując oryginalny cel drugiej funkcji, którą zamieściłem poniżej.
Na razie oto zawartość mojego
~/.inputrc
pliku:"\C-j": "\C-a measure \C-m"
A oto zawartość
.bashrc
(uwaga, nie używałem bash od zawsze - używam mksh jako mojej powłoki, stąd to widać w oryginalnym poście. Funkcjonalność jest nadal taka sama)Oryginalny post
Oto mój pomysł - użyj funkcji w
.bashrc
. Podstawowa zasada - służy/usr/bin/time
do pomiaru czasu potrzebnego do wykonania polecenia, a jeśli jest on dłuższy niż 15 sekund, wyślij powiadomienie.Tutaj przekierowuję dane wyjściowe do,
/dev/null
ale aby wyświetlić dane wyjściowe, można również dokonać przekierowania do pliku.O wiele lepszym podejściem, IMHO, jest wysyłanie wyniku czasu do jakiegoś pliku w folderze domowym (tylko po to, abyś nie zanieczyszczał systemu plikami czasowymi i zawsze wiedział, gdzie szukać). Oto druga wersja
A oto zrzuty ekranu pierwszej i drugiej wersji, w tej kolejności
Pierwsza wersja, brak danych wyjściowych
Druga wersja z wyjściem
źródło
sudo lsof
i głównie zping -c20 google.com
.Niedawno zbudowałem narzędzie, które służy temu celowi. Może być uruchamiany jako opakowanie lub automatycznie z integracją powłoki. Sprawdź to tutaj: http://ntfy.rtfd.io
Aby zainstalować:
Aby użyć go jako opakowania:
Aby automatycznie otrzymywać powiadomienia, dodaj to do swojego
.bashrc
lub.zshrc
:źródło
Twój skrypt działa całkiem dobrze, upewnij się tylko, że dołączasz
#!/bin/bash
wiersz „shebang” ( ) . Inne#!/bin/bash
są tutaj wymienione , ale przez większość czasu#!/bin/bash
działa dobrze dla skryptów bash dla Uniksa. Jest wymagany przez interpretera skryptów, aby wiedział, jaki to jest typ skryptu.Wydaje się, że działa to jako skrypt testowy:
Aby zmodyfikować ten skrypt, umieść komendę w miejscu, w którym znajdują się linie
echo
isleep
.Uwaga za pomocą
notify-send
, możesz także użyć-i
ikony :-)Upewnij się także, że jest wykonywalny, uruchamiając
chmod +x /PATH/TO/FILE
go najpierw.źródło
Możesz zmodyfikować Bash, aby zaimplementować pożądaną funkcję opakowania.
Jeśli jesteś skłonny wprowadzić wiele takich modyfikacji do swojej interaktywnej powłoki, możesz rozważyć przejście na wewnętrznie hakowalną powłokę, taką jak eshell, która jest zbudowana przy użyciu elisp Emacsa i ma wszystkie swoje spersonalizowane możliwości dostosowywania:
http://www.masteringemacs.org/articles/2010/12/13/complete-guide-mastering-eshell/
źródło
Możesz to również zrobić za pomocą takiej prostej instrukcji if
Możesz użyć własnych nazw zmiennych.
Mogę potwierdzić, że to działa, przetestowałem przy użyciu polecenia, które zajmuje dużo czasu, a które nie, a powiadomienie przychodzi dla tego, które zajmuje dużo czasu
Można również zrobić to z każdym poleceniem zastępując
ORIGINAL_COMMAND
ze$@
i uruchamiając skrypt jako./script command
.źródło
$((2+2))
jest wbudowanym bash, nie wymaga żadnych dodatkowych programów. Po trzecie: nie działa z poleceniami zawierającymi spacje. tl; dr: jest gorzej niż w przypadku innych rocznych odpowiedzi