Domyślny alias Alert dotyczy polecenia
notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"
Wykonanie alert
daje powiadomienie z tekstem Alert i ikoną terminala. Wykonanie go za pomocą jednego parametru jak alert !!!!!
daje powiadomienie z tekstem Alert !!!!! i !!!!! .
Jaka jest zatem różnica między prostym notify-send
poleceniem a tym złożonym aliasem, który wykorzystuje powiadomienie-wysyłanie, echo, historię, ogon i sed ?
W jakich sytuacjach ten alias jest użyteczny, czy został stworzony właśnie dla gry słów (Coś jak używanie sudo sudo sudo sudo sudo apt-get install
Używam Ubuntu 12.10
bash
notification
zarejestrowany użytkownik
źródło
źródło
notify-send Linux Ubuntu
to jest tak samo, jedyną różnicą jest to, żealert
pokazuje ikonę, ale nie rozumiem, dlaczego polecenie zawiera sed, ogon i historięOdpowiedzi:
Możesz użyć stron podręcznika, aby uzyskać szczegółowe informacje o tym, co robią połączone tutaj polecenia. Oto trochę o celu tych poleceń tutaj:
Spowodowałoby to wyświetlenie echa terminala lub błędu zgodnie ze statusem wykonania - odpowiednio zakończonym lub zakończonym niepowodzeniem ostatniego polecenia; a wynik jest wartością
-i
przełącznikanotify-send
wyświetlania ikon... aby wykonać ostatnie polecenie.
i
sed
parsować tekst, aby wyświetlić go znotify-send
komunikatem.Aby je zrozumieć, spróbuj wykonać następujące czynności:
.. to echo terminala .
... to echo błędu .
I,
.. bardzo przydatne jest poznanie wartości wyjściowej ostatniego wykonanego polecenia.
..nested
echo
jako proste demo do użycia$()
w zestawie komend.źródło
notify-send
.. status wyjścia ostatniego polecenia jest sprawdzany za pomocą wartości$?
.. Uwzględniłem to w edycji ..Pozwól mi wyjaśnić, co się tutaj dzieje:
1
--urgency=low
2
-i "$([ $? = 0 ] && echo terminal || echo error)"
.Ta część
"$([ $? = 0 ] && echo terminal || echo error)"
.$?
jest ostatnim zwróconym błędem (lub sukcesem). Zwraca więc tekst „terminal”, jeśli kod wyjścia ostatniego polecenia wynosił 0, bez błędów. Lub zwraca „błąd”, jeśli kod wyjścia nie był równy 0.I wreszcie pojawia się ikona „terminal” lub „błąd”.
3)
$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')
history|tail -n1
zwraca ostatnie polecenie z historii.sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')
można to rozdzielić na 2 bloki sed.3.1
sed 's/^\s*[0-9]\+\s*//'
usuń wszystkie poprzednie spacje i tabulatory, wszystkie później numeryczne, a także usuń spacje i tabulatory na końcu.3.2
s/[;&|]\s*alert$//
usuwa poprzednie symbole;
&
|
, wszelkie tabulatory i spacje oraz słowo „alert”.Jest to po prostu czyste ostatnio wykonane polecenie z symboli, a na końcu słowo „alert”.
Więc jeśli użyjesz czegoś takiego:
Wyświetli alert z poprzednim poleceniem.
źródło
Myślę, że obecne odpowiedzi wyjaśniają, w jaki sposób działają wewnętrzne czujności (tego właśnie chciałem się dowiedzieć z ciekawości i które mnie tu doprowadziły). Ale myślę, że oryginalny OP pyta o to , co jest użyteczne, co spróbuję wyjaśnić, jak rozumiem z pochwał nad powyższą deklaracją.
Zasadniczo służy do ostrzegania, gdy polecenie zakończy się, gdy nie możesz siedzieć i obserwować terminal przez cały czas, czekając na jego zakończenie. Zgodnie z przykładem polecenia
sleep 10; alert
pokaże powiadomienie polecenia (sleep 10
w tym przypadku) z ikoną terminala, jeśli się powiedzie (przejście w tryb uśpienia 10 zajmie 10 sekund).Z tego widać, że należy go używać jako
<command>; alert
miejsca zastępowania polecenia swoim poleceniem. Ja osobiście muszę pobierać wideo codziennie przez wget, ponieważ co jakiś czas się nie udaje. Więc po prostu dołączam polecenie pobierania z alertem, aby natychmiast powiadomić mnie, gdy się nie powiedzie, aby można go było kontynuować (mój alert został zmodyfikowany, aby również wydać dźwięk, aby zwrócić moją uwagę).źródło
Powodem
sed
,tail
ihistory
to nie dlatego, że musi dostać wiadomość, że wpisałeś. (Z jakiegoś powodu), to, co wpisałeś, nie jest bezpośrednio dostępne przez żadną zmienną. Dlatego musi użyć,history
aby uzyskać listę wszystkiego, co wpisałeś,tail -n1
aby uzyskać ostatnią wpisaną rzecz, oraz kilka wyrażeń regularnych, aby pozbyć się polecenia „alert” na początku.Aby to rozwinąć, znajduje się tam polecenie warunkowe, które sprawdza, czy
$? = 0
jest to prawda. Z tego co mogę powiedzieć, jeśli to prawda, to pochodzi z terminala i powinno być traktowane jako normalny komunikat. W przeciwnym razie należy uznać to za błąd i pojawi się ikona błędu.źródło
$0
daje pierwszy argument za poleceniem. Jednak może być inaczej w przypadku aliasu.