unikanie podwójnych cudzysłowów i znaków procentu (%) w cron

75

Następujące polecenie działa z wiersza polecenia, ale nie z pliku crontab.

 grep abc  /var/log/messages | grep "`date '+%B %d'`" | mail -s"abc log of `hostname`" shantanu.oak+`hostname`@gmail.com

Muszę dodać to do codziennego crona.

shantanuo
źródło
Twój przykład jest niesamowity,% jest otoczony podwójnymi, prostymi i wstecznymi cudzysłowami. Nie pozostawiając nadziei, że ucieczka cytatu może zadziałać.
tuxayo

Odpowiedzi:

126

Musisz uciec od %znaków. Mają szczególne znaczenie w crontabs:

man (5) crontab:

Percent-signs (%) in the command, unless escaped with backslash (\), 
will be changed into newline characters, and all data after the 
first % will be sent to the command as standard input.
bmk
źródło
7
+1 Bardzo ciekawe, też tego nie wiedziałem. Zaskoczony, że na to nie wpadłem.
Kyle Smith
3
Właśnie wpadłem na to. Używałem date +%Fi był donikąd
Adamo
2
Czy ta składnia ma jakieś użyteczne zastosowanie? Dzięki SHELL=/bin/bash, zawsze mogę przepisać cat %Hello worldjako cat <<<'Hello world'. Nie widzę potrzeby specjalnej składni.
Witiko,
@Witiko Jeśli „specjalna składnia”, o którą pytasz, to ukośnik odwrotny, aby uciec przed procentem, to własne pytanie OP jest przykładem, gdzie jest to potrzebne: argumenty poleceń wymagające procentu, zwłaszcza program daty, który byłby dość popularny w polecenie crontab. Jeśli faktycznie pytasz, dlaczego cron ma tę gotcha w pierwszej kolejności: tzn. Zastępuje podawanie linii zamiast wartości procentowej, to myślę, że pozwala to na podanie w jednym wierszu wymaganym przez crontab „polecenia” składającego się z dwóch lub więcej pomocniczych poleceń.
gwideman
Ten ostatni. I, jak wspomniałem, można zrobić to samo z bash. Nie ma potrzeby zaśmiecania składni Crona.
Witiko,
7

To nie odpowiada bezpośrednio na twoje pytanie, ale sugerowałbym, abyś utworzył plik skryptu w / usr / local / bin (lub ~ / bin lub cokolwiek innego, co jest odpowiednie) i wywołaj go z crona. Łatwiej jest testować i edytować.

Randy Orrison
źródło
2
Z mojego doświadczenia wynika, że ​​o wiele łatwiej jest utrzymać 50 wierszy w pliku crontab niż 50 małych plików. Z pewnością będziesz chciał zamienić dłuższe skrypty w pliki skryptów, ale zrobienie tego dla jedno-liniowych linii może być przesadą.
Witiko