Jak mogę przepisać to polecenie na e-mail, tylko jeśli dane wyjściowe są wysyłane z mailq | grep
?
mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
Czy to w ogóle możliwe na jednej linii?
Zobacz Sprawdzanie, czy potok jest pusty i uruchom polecenie na danych, jeśli nie dotyczy to bardziej ogólnego przypadku niż wysyłanie wiadomości e-mail.
Odpowiedzi:
Myślę, że będziesz musiał użyć pliku tymczasowego do tej operacji, abyś mógł użyć
&&
operatora do uruchomienia polecenia mail tylko wtedy, gdy grep zwrócił status wyjścia, który mówi, że ma takie dopasowania:Jeśli nie przeszkadzało ci, że plik tymczasowy gdzieś się zatrzymał i możesz użyć jego statycznej nazwy, możesz pominąć specjalne czynności związane z nazywaniem i usuwaniem:
Edycja: Po zobaczeniu odpowiedzi glenna bawiłem się tym trochę i najwyraźniej przypisanie zmiennej przy użyciu
$()
składni zwraca kod wyjścia polecenia, więc możesz pominąć test użyty dla długości łańcucha i użyć go zamiast tego. Oto wszystko w jednym poleceniu:Edycja 2: Po zobaczeniu odpowiedzi Simona sprawdziłem mój
mail
program. Nie zachowuje się w sposób opisany domyślnie, ale ma na to opcję. Ze strony podręcznika:Umożliwiając to:
źródło
mktemp
nie zwrócą czegoś, co wymaga cytowania.glob(split(var))
. Nie potrzebujesz tutaj dzielenia słów ani rozszerzania globu plików, więc nie pytaj o nie. Ponadto musimy pokazać właściwą drogę na tej stronie .zsh
i właściwie nie dostaję globowania ani dzielenia słów w takich przypadkach, chyba że o to poproszę, ale ze względu na odpowiedzi tutaj i nie wiedząc, że docelowe środowisko cytowane z zasady jest w porządku.Program narzędziowy ifne istnieje specjalnie w tym celu: aby uruchomić polecenie, jeśli standardowe wejście nie jest puste.
Polecenie ifne jest częścią pakietu moreutils , rozliczanego jako „rosnąca kolekcja narzędzi uniksowych, o których nikt wcześniej nie pisał, gdy był Unix”.
źródło
Możesz zapisać dane wyjściowe w zmiennej, a następnie wywołać polecenie mail, jeśli długość ciągu nie jest równa zero.
W jednym wierszu połącz dwa polecenia średnikiem.
źródło
Użyj
mail
z-E
opcją. Na moim Macu MAIL (1) mówi, że-E
flaga nie wyśle e-maila z pustym ciałem.Na komputerze Mac przeprowadziłem następujący test. Zauważ, że plik
file_does_exist
istnieje, ale plikfile_does__not_exist
nie istnieje.To wysyła do mnie e-mail:
To nie dotyczy Zauważ, że polecenie
ls file_does_not_exist | egrep ...
nie generuje żadnych danych wyjściowych.źródło
W tym konkretnym przypadku, jeśli
mail
obsługujesz tę-E
opcję , po prostu jej użyj. W ogólnym przypadku możesz spróbować odczytać jedną postać; jeśli istnieje, uruchom komendę postprocessing i podaj ten znak z reszty pliku.Zwróć uwagę na przydatne użycie
cat
. Dodanieecho .
sprawia, że ta funkcja działa, nawet jeśli pierwszym znakiem na wejściu jest nowa linia (pamiętaj, że$(…)
konstrukcja usuwa końcowe znaki nowej linii).W przypadku większości powłok (cokolwiek innego niż zsh, o ile wiem), jeśli plik zaczyna się od znaku zerowego, kod ten uwierzy, że jest pusty. Naprawianie pozostawione jako ćwiczenie dla czytelnika. (Wskazówka: użyj
od
w pierwszej podpowłoce iprintf
wydrukuj pierwszy bajt.) (Rozwiązanie: jak sprawdzić, czy potok jest pusty ) Możesz napotkać ten sam problem, jeśli plik zaczyna się bajtem, który nie jest prawidłowym znakiem w bieżącym widownia; łatwiej to naprawić, uruchamiając ten kod za pomocąLC_ALL=C
.źródło
read
pomocy może to uprościć?read
przenośnego sh (może to być możliwe w bash, ksh lub zsh).IIRC
mail
polecenie BSD przerywa działanie, jeśli otrzyma pusty komunikat.źródło
-E
opcję, aby włączyć go .Ostatnio dowiedziałem się o nazwie polecenia,
ifne
która jest częściąmoreutils
pakietu. Gdzie możesz go użyć do rozwiązania tego konkretnego problemu.przykład ze strony man,
źródło
Możesz przepisać swoje polecenie za pomocą,
test -s /dev/stdin
aby sprawdzić, czy część ma dane wyjściowemailq | grep
.źródło