Korzystanie z domyślnego aliasu „alert”

9

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 alertdaje 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-sendpoleceniem 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

zarejestrowany użytkownik
źródło
Jedyne, co mogę wymyślić, to po prostu ułatwić tworzenie powiadomień ... może?
saiarcot895
@ saiarcot895 spróbuj, notify-send Linux Ubuntuto jest tak samo, jedyną różnicą jest to, że alertpokazuje ikonę, ale nie rozumiem, dlaczego polecenie zawiera sed, ogon i historię
Zarejestrowany użytkownik

Odpowiedzi:

8

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:

"$([ $? = 0 ] && echo terminal || echo error)"

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ą -iprzełącznika notify-sendwyświetlania ikon.

history|tail -n1

.. aby wykonać ostatnie polecenie.

i sedparsować tekst, aby wyświetlić go z notify-sendkomunikatem.


Aby je zrozumieć, spróbuj wykonać następujące czynności:

true; echo "$([ $? = 0 ] && echo terminal || echo error)"

.. to echo terminala .

false; echo "$([ $? = 0 ] && echo terminal || echo error)"

... to echo błędu .

notify-send -i terminal 'Please note the icon..' 'the default icon for the terminal has been used. You can specify any other icon of your choice'

I,

echo $?

.. bardzo przydatne jest poznanie wartości wyjściowej ostatniego wykonanego polecenia.

echo "$(echo "the output of this command enclosed within \$(...)") is being supplied here in the outer echo command where is used as an argument."

..nested echojako proste demo do użycia $()w zestawie komend.

precyzyjny
źródło
1
więc tego aliasu można użyć do poinformowania użytkownika, czy polecenie zostało wykonane pomyślnie, czy nie, ale w GUI.
Zarejestrowany użytkownik
tak, powiadomiłby graficznie zarówno o pomyślnym, jak i nieudanym wykonaniu graficznym za pomocą notify-send.. status wyjścia ostatniego polecenia jest sprawdzany za pomocą wartości $?.. Uwzględniłem to w edycji ..
dokładnie
7

Pozwól mi wyjaśnić, co się tutaj dzieje:

notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"

1 --urgency=low

-u, --urgency = POZIOM Określa poziom pilności (niski, normalny, krytyczny).

2 -i "$([ $? = 0 ] && echo terminal || echo error)" .

  -i, --icon=ICON[,ICON...]
         Specifies an icon filename or stock icon to display.

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:

echo "Hello alert" | alert

Wyświetli alert z poprzednim poleceniem.

c0rp
źródło
3

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; alertpokaże powiadomienie polecenia ( sleep 10w 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>; alertmiejsca 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ę).

chesedo
źródło
0

Powodem sed, taili historyto 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ć, historyaby uzyskać listę wszystkiego, co wpisałeś, tail -n1aby 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 $? = 0jest 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.

saiarcot895
źródło
Nie pozbędzie się alertu , pozostanie w powiadomieniu.
Zarejestrowany użytkownik
1
Jeśli odpowiesz „z jakiegoś powodu”, często nie jest to bardzo dobra odpowiedź;)
Wymagaj
@Requist: Dodałem „z jakiegoś powodu” do tej konkretnej instrukcji, ponieważ miałem wrażenie, że $0daje pierwszy argument za poleceniem. Jednak może być inaczej w przypadku aliasu.
saiarcot895